Redian新闻
>
陕甘宁边区居民:八路没来以前猪肉比菜还便宜
avatar
陕甘宁边区居民:八路没来以前猪肉比菜还便宜# Joke - 肚皮舞运动
b*t
1
就问了 double pow(double a, int b);
下面是我给的code:
{
if (b==0) return 1;
if (b==1) return a;
int c = abs(b);
double results=pow(a,c/2);
results=results*results;
results=(c%2 ==0)?results:results*a;
if (b<0) return 1/results;
else return results;
}
得知悲剧,大家看看我的code有问题吗?多谢
avatar
x*u
2
【 以下文字转载自 History 讨论区 】
发信人: cwlch (cwl), 信区: History
标 题: 陕甘宁边区居民:八路没来以前猪肉比菜还便宜
发信站: BBS 未名空间站 (Wed Sep 14 23:09:13 2011, 美东)
陕甘宁边区居民:八路没来以前猪肉比菜还便宜
本文摘自《延安日常生活中的历史(1937-1947)》 作者:朱鸿召 出版社:广西师范
大学出版社
2011年08月08日 来源:凤凰网历
核心提示:人家对我说,在八路军未到之前,猪肉比菜还不值钱,1元可以买到十二三
斤,而且陕北人的脾气很特别,猪肚里的东西是不吃的,猪肝呀、猪肠呀……都抛了的
。但现在,猪肝卖五角一个。——陈学昭 :《延安访问记》(陈学昭抗日战争时期曾
任延安《解放日报》副刊编辑 解放后曾任全国政协委员 是中国著名作家 现已去世)
延安革命队伍里实行供给制,作为一个“公家人”,一般吃住用全部由公家按照不同的
级别等差无偿供给,个人需要购买的东西很少,除非私自给自己或邀几个朋友下馆子加
餐开荤。但作为一个国家的雏形,延安时期仍然发行货币。市面流通的钱先后有“苏票
”、“法币”、“光华券”、“边币”、“流通券”等几种形式。由于有了这些不同的
钱币,便带来人们生活中物价的涨与落,以及生活水平的好与孬。
最初红军带到延安的钱是“苏票”,即“苏维埃国币”,又称苏币。早在1932年2月中
华苏维埃共和国国家银行便创立,7月7日开始发行统一的新纸币“苏维埃国币”,面额
为一元、五角、二角、一角、五分,共5种。苏票一元与法币一元相等值。
“1934年10月红军长征时,毛泽民(时任苏维埃国家银行行长——引者注)奉命携带苏
维埃国家银行的160多担黄金、白银和苏币,组成特别大队,保证红军给养;同时还兼
负管理沿途运输、接收打土豪的财物、筹粮筹款等项工作……”余伯流:《中央苏区经
济史》,南昌:江西人民出版社1995年4月版,第435页。红军长征到达陕北后,以苏维
埃国家银行西北办事处的名义,继续发行过一些苏票,但流通有限。
1937年9月,中华苏维埃共和国临时政府驻西北办事处更名改制为陕甘宁边区政府,随
之,苏维埃国家银行西北办事处也相应地改名为陕甘宁边区银行,承认并流通法币,逐
步收回苏票。
“法币”,是指1935年11月国民政府实行币制改革,废除“银本位”制度,“废两改元
”,改用统一的纸币流通,规定以中央银行、中国银行、交通银行三大银行(1936年2
月又增加了中国农民银行,共四大银行)所发行的纸币为法定货币,即“法币”。1938
年6月,边区银行发行了小面额的“光华商店代价券”,简称“光华券”。
一年后,国民政府得到报告,大为光火,责令严查。1939年4月7日先由陕甘宁边区政府
主席林伯渠致电国民政府行政院院长兼财政部部长孔祥熙:“查陕甘宁边区政府辖境内
法币信用甚高,流通亦畅,惟零星辅币万分缺乏,影响物价之提高,有碍小民生活。经
当地商会、农会等向边区政府环请,准许光华商店发行二分、五分、一角之代价券。原
系暂时权宜便民之计,而其流通范围只限陕甘宁边区。发行以来,因准备充足,深得人
民信仰,并无武装部队强迫行使情事。尊座听得报告,完全与事实不符。”参见《陕甘
宁边区政府文件选编》第1辑,北京:档案出版社1986年5月版,第230页。
次日,再由边区政府向国民政府军事委员会委员长天水行营主任程潜呈文,重申上述缘
由。4月10日,边区政府又一次致函国民党西安行营:“查边区境内,法币信用甚高,
流通亦畅,惟于开始推行之期,流通市面之法币,多系五元十元者,而零星辅币,万分
缺乏……农民则因需用品之不易购到,宁愿物物交换,不肯接受法币。”边区银行经托
请八路军驻西安办事处,向有关方面交涉,结果由中央银行兑换少量辅币,同时由国民
政府支付给八路军的军饷,同意辅币占十分之一。这样,市面上仍然小票太缺,多用邮
票找零。于是,便有了“光华券”。
光华商店是由原边区政府贸易局改制而成,归属于边区银行经营管理的当时延安最大的
一家商店。“光华券”票面为五角、二角、一角、五分、二分共5种,作为法币的辅币
,开始只发行10万元,持券者可以随时到光华商店如数兑换法币,信誉甚好。1939年国
民党颁布限制“异党”活动办法后,自“西安事变”和平解决后形成的第二次国共合作
受到破坏,国共两党关系大不如前。入冬以后,延安物价猛涨,法币狂跌,陕甘宁边区
财政供给出现困难,于是在开展大规模生产运动的同时,为了调剂金融,周转财政,遂
扩大光华券的发行,至1939年12月共计发行31万元,至1940年12月共计发行311万元。
1941年1月,开始试发行“边币”,并增加发行票面为七角五分的代价券,连同前面发
行的五种,光华券共计六种。到1941年12月,共计发行430.725万元,其中边币4.16万
元。
“边币”是陕甘宁边区银行发行的正式货币。与光华券一样,票面上都标以”中华民国
“纪年,但大红着色,妇女纺纱、羊群等图案已经具有鲜明的解放区文化特色。1941年
“皖南事变”发生后,1月28日边区政府委员会决定独立发行边区自己的货币,1月30日
颁布法令禁止法币在边区范围内流通。2月18日,边区银行正式发行边币,票面为一元
、五元、十元,与光华代价券辅币配合使用,以后逐渐以边币收回光华代价券。
据时任边区银行行长的南汉宸在1941年11月召开的陕甘宁边区第二届参议会上的报告《
财政工作报告》介绍,“政府为了在边区维持法币价格,调剂金融流通,同时为了防止
法币对敌占区的流出,今年春天在以现金与法币作基金的条件下,发行了1200万元的边
币,在边区市场以内流通。以边区200万人口计算,1200万元的边币,平均每人流通量
只有6元(据估计大后方平均在40—50元),这在百物昂贵的今日,绝对不会超过市场
的需要,换句话说就是绝对不会造成恶性通货膨胀的现象。然而我们毋庸讳言,边币的
贬值与边币在金融市场上的波动之大,是一个很严重的问题。”
另据边区银行的一份工作总结材料介绍:“边币发行之初,边、法币的比价是一元当一
元的。不久,边币的比价便开始下降,同时,物价也在上涨,不过在1941年5月以前边
币下跌与物价上涨的速度比较和缓,边币在边区各处都能使用。5月间发生了金融波动
,边币跌到1.5元换法币1元,绥德、关中、陇东、三边等地都拒用边币,物价上涨尤甚
。5月份延安市的物价比4月份就涨了30%,6月份又比5月份涨了26%。五六月间物价猛涨
,边币由各地逐渐向延安中心区域退回,到7月间延安边币就跌到2元,延安市亦公开使
用法币交换,这时政府内部对发行问题有了争论。”边区银行:《关于金融工作总结》
,1944年2月。
争论的结果是,对内发展生产,特别是边区农业的发展;对外运盐,以求出入口贸易的
平衡。1941年10月17日,南汉宸在边区专员县长联席会议上作关于财政工作的报告谈到
:“货币要巩固,一定要有一种物质作保障,我们边币的物质保障是盐,只有用大批的
盐当作外汇,去换回法币和必需品来,才能使边币达到巩固。”他估计这个必需品的一
年消费在7000万元,如果一年能运40万驮盐出去,按当时价格可得1亿元,除消费外还
余3000万元,用之收购市场上“非法”流通的法币,就可以降低边币对法币的比价。
当时关中地区的食盐,主要有两个产地:山西运城的潞盐、陕北三边(定边、安边、靖
边)的花马池盐。前者受阎锡山的严格控制,如果陕北的盐再受控制,那么就只有用青
海的盐或淮盐,长途运输成本是本地盐的许多倍。所以,边区食盐出口对于调节金融危
机起到了很好的作用,到1941年底,边区金融比较稳定。但是,1942年初,边区银行又
增加发行1000万元边币,其中发放农业贷款500万元。5月,边币继续下跌到2.9元换法
币1元,6月达到3.2元换法币1元,绥德等个别地区黑市竟达到边币4.5元换法币1元。同
时,4月份物价比3月份上涨38%。
1942年7月以后,由于华中汪伪政权宣布通货统一令,贬低并禁止法币,大量法币自沦
陷区流向大后方,大后方出现用法币抢购物资的现象。法币市场的大环境有利于边区金
融市场的进一步调整,7月间边币3.2元换法币1元,到10月间便变成边币2.1元换法币1
元。
“流通券”全称为“陕甘宁边区贸易公司商业流通券”,是1944年5月名义上为贸易公
司,实际上仍由边区银行发行的货币代用券。票面额为五十元、十元两种,规定每元当
边币15元,实际发行后比价为每元当边币20元。发行商业流通券的目的,一是“目前由
于发展生产,即[既]无法回笼边币,又不能以法币投资……其次法币日益下降,边币日
趋提高,流通范围日益扩大,加以物价变动,边币筹码颇感不足,没有这个发行,不仅
市场停滞,而且必然法币侵占边区市场。再次我们现在不但有大量的物质基础(法币和
物资),而且各方面有充分准备,发行是有保证的。”西北局常委会:《关于发行商业
流通券致各地委电》,1944年7月29日,第3号。
1945年5月1日,西北财政经济办事处发出通知:
1自6月1日起,实行贸易公司商业流通券为陕甘宁边区本位币,并责成边区银行尽可
能迅速收回边币。按所有未收回的边币,仍照边币20元等于流通券1元比价,一律通用。
2凡财政厅、建设厅及其所属机关、工厂、银行总分支行、贸易公司所属企业,以及
其他一切财政供给部门和公营企业,一律改用流通券为记账本位币。
3各公营商业在交易中的挂牌、定价、契约、单据以及口头讲价等,均一律改用流通
券为本位(币)。
4一切税收及预算,均改用流通券计算。
在此货币频繁变更的背后,是物价的起伏波动。据西北财经办事处1949年2月18日公布
的《陕甘宁边区银行各种统计表》中,1937—1945年期间延安市物价总指数显示:(以
1937年上半年平均物价指数为100计算)
1938年7月为153.3,12月为161.4,全年为143.1;
1939年6月为201.6,12月为377.3,全年为237.3;
1940年6月为420.8,12月为716.9,全年为500.6;
1941年6月为1914.5,12月为4421.0,全年为2228.9;
1942年6月为10180.0,12月为13773.0,全年为9904.0;
1943年6月为64757.8,12月为343059.8,全年为124078.4;
1944年6月为556980.0,12月为768807.8,全年为616487.4;
1945年6月为1995825.0,12月为1825918.5,全年为1591495.4。
也就是说,1945年底延安的物价指数,是1937年初的18259倍。
专业统计数字是枯燥乏味的,但其背后所揭示的却是实实在在的具体生活内容。陈学昭
曾经记载下1938年秋延安的物价情况:
猪肉每斤0.5元、猪油每斤0.8—0.9元、山羊肉每斤0.35元、绵羊肉每斤0.4元。
“人家对我说,在八路军未到之前,猪肉比菜还不值钱,1元可以买到十二三斤,而且
陕北人的脾气很特别,猪肚里的东西是不吃的,猪肝呀、猪肠呀……都抛了的。但现在
,猪肝卖五角一个。……有一次,我走进菜场,看见两只鸡,我问价。“一元,”鸡主
人说。“九角两只卖不卖?”“不卖,差一钱也不卖!”我正在想“一元买了也好”,
可是正沉思着还没有决定的这顷刻,他说:“你不买,走开罢,立在这里看什么?”陈
学昭:《延安访问记》,同前引第91—93页。
白糖在延安一直很紧俏,价格不菲。1938年秋,白糖每斤1元,而同时期在重庆售价为0
.25元。
队伍里的公家人日常住宿是全部免费的,但有一种情况却要收费。那是星期六的晚上,
一般普通夫妻一周团圆一次,没有单独的住处,就要事先申请,再交费,住由临时腾出
来的十几孔窑洞组成的“青年宿舍”,近乎后来的青年公寓。“屋里只有一张床,被褥
得自己带,也不开饭,住一次交5毛钱。每到周六,小两口背着被褥来住一晚上,第二
天又背上行装回到各自的战斗岗位。”莫文骅:《莫文骅回忆录》,北京:解放军出版
社1996年7月版,第353页。
1938年12月10日开始至年底,延安《新中华报》开设“五日延安”专栏,公布延安市场
上主要生活物资价格,该日价格为:
麦子每斗4元1角、黄豆每斗3元、绿豆每斗3元5角、猪肉每斤5角、羊肉每斤3角5分、食
盐每斗5角8分、青油每斤6角5分、萝卜每斤3分、市布每尺3角、土布每尺3角、斜布每
尺3角、有光纸每刀3元5角、工资每天5角5分。
此间公布的物价,个别物品略有波动,但总的来说物价平稳。其中所列的工资额是指临
时雇工的工资。而同时期(1939年1月)重庆、成都的基本生活物资指数分别是:
重庆大米每斗3元5角、食盐每斤1角4分、猪肉每斤2角3分、机器工人工资每月30元、纺
织工人工资每月18元(自给伙食);(按每斗37斤,每斤14两计算。)
成都大米每斗2元、食盐每斤2角、猪肉每斤2角、机器工人工资每月30元、纺织工人工
资每月6元(厂方提供伙食)。(按每斗32斤,每斤14两计算。)白戈:《平抑物价与
平抑工资》,《解放日报》(延安)1942年2月13日。
从1937年初至1940年底,通往延安的小路上,经常能看到这样历经千辛万苦徒步数百里
,奔赴延安的青年知识分子
由于大批青年知识分子奔赴延安,原来生活基础不厚的陕北小城,生活指数比同时期重
庆、成都偏高,但实行供给制条件下的革命队伍里的同志们,其生活都是有保障的。
=========================
也就是说,1945年底延安的物价指数,是1937年初的18259倍
avatar
d*t
3
看题目跟machine learning有毛关系啊!

【在 b***t 的大作中提到】
: 就问了 double pow(double a, int b);
: 下面是我给的code:
: {
: if (b==0) return 1;
: if (b==1) return a;
: int c = abs(b);
: double results=pow(a,c/2);
: results=results*results;
: results=(c%2 ==0)?results:results*a;
: if (b<0) return 1/results;

avatar
H*7
4
参见《红太阳如何升起》
avatar
H*1
5
a = 0 ?

【在 b***t 的大作中提到】
: 就问了 double pow(double a, int b);
: 下面是我给的code:
: {
: if (b==0) return 1;
: if (b==1) return a;
: int c = abs(b);
: double results=pow(a,c/2);
: results=results*results;
: results=(c%2 ==0)?results:results*a;
: if (b<0) return 1/results;

avatar
k*i
6
“屋里只有一张床,被褥得自己带,也不开饭,住一次交5毛钱。每到周六,小两口背
着被褥来住一晚上,第二天又背上行装回到各自的战斗岗位。”
钟点房啊~
avatar
q*x
7
不简洁。
{
if (b==0) return 1;
if (b==1) return a;
int c = abs(b);
double results=pow(a,c/2);
results = results * results;
if (c%2) results *= a;
return (b < 0 ? 1/results : results);
}
递归也不是最高效的做法。循环好。
abs被递归函数调用多次。但其实一次就够。
另外0的0次方怎么算?

【在 b***t 的大作中提到】
: 就问了 double pow(double a, int b);
: 下面是我给的code:
: {
: if (b==0) return 1;
: if (b==1) return a;
: int c = abs(b);
: double results=pow(a,c/2);
: results=results*results;
: results=(c%2 ==0)?results:results*a;
: if (b<0) return 1/results;

avatar
P*c
8
我觉得简洁性和递归都还好。a=0那个情况考虑不到的人应该也很多。如果只有这一道
题的话,应该是解题过程问题。如果楼主是一下子得出答案的,那不太可能就这一题。
如果整个电面就解了这一题,那过程肯定不短。

【在 q****x 的大作中提到】
: 不简洁。
: {
: if (b==0) return 1;
: if (b==1) return a;
: int c = abs(b);
: double results=pow(a,c/2);
: results = results * results;
: if (c%2) results *= a;
: return (b < 0 ? 1/results : results);
: }

avatar
q*x
9
同意。

【在 P**********c 的大作中提到】
: 我觉得简洁性和递归都还好。a=0那个情况考虑不到的人应该也很多。如果只有这一道
: 题的话,应该是解题过程问题。如果楼主是一下子得出答案的,那不太可能就这一题。
: 如果整个电面就解了这一题,那过程肯定不短。

avatar
B*1
10
上个我收藏的火鸡的代码:
public double power(double x, int n) {
if (n < 0) return 1.0/power(x, -n);
double r = 1.0, pow = x;
while (n > 0) {
if ( (1 & n) > 0 ) r *= pow;
n >>= 1;
pow *= pow;
}
return r;
}
avatar
f*t
11
练习时写的,开方数支持小数和负数
double sqrt(double n)
{
if(n <= 0.0)
return 0.0;

double ans = n / 2.0;
int round = 0;
const double epsilon = 0.00001;
while(true) {
round++;
ans = (ans + n / ans) / 2;
double diff = ans * ans - n;
if(diff < 0)
diff = -diff;
if(diff < epsilon)
break;
}

//printf("Calculated %d rounds\n", round);

return ans;
}
double powerDouble(double a, double n) {
bool neg = false;
if(n < 0.0) {
neg = true;
n = -n;
}

double result = 1.0;
double part1 = a, part2 = sqrt(a);
int nl = (int)n;
double nr = n - (double)nl;
printf("n = %f, left = %ld, right = %f\n", n, nl, nr);
while(nl > 0) {
if(nl & 1)
result *= part1;
part1 *= part1;
nl >>= 1;
}
nr *= 2.0;
int count = 0;
while(nr > 0.0) {
if(nr >= 1.0) {
result *= part2;
nr -= 1.0;
}
part2 = sqrt(part2);
nr *= 2.0;
count++;
if(count > 10)
break;
}

if(neg)
return 1.0 / result;
else
return result;
}
avatar
q*x
12
n > 1 vs n < 1?

【在 f*******t 的大作中提到】
: 练习时写的,开方数支持小数和负数
: double sqrt(double n)
: {
: if(n <= 0.0)
: return 0.0;
:
: double ans = n / 2.0;
: int round = 0;
: const double epsilon = 0.00001;
: while(true) {

avatar
x*o
13
仰慕。。。

【在 f*******t 的大作中提到】
: 练习时写的,开方数支持小数和负数
: double sqrt(double n)
: {
: if(n <= 0.0)
: return 0.0;
:
: double ans = n / 2.0;
: int round = 0;
: const double epsilon = 0.00001;
: while(true) {

avatar
f*t
14
?

【在 q****x 的大作中提到】
: n > 1 vs n < 1?
avatar
q*x
15
原来是牛顿法。

【在 f*******t 的大作中提到】
: ?
avatar
i*o
16
Because double (similarly float) only has limited precision, the
associative
law for multiplication does not hold.
In other words, following equation is NOT true for double.
a*a*a*a = (a*a)*(a*a)
The rounding error could become significant enough that two will have
different results.
For the same reason, many compile optimizations are not performed for
equations involving double and floating.
avatar
r*t
17
certainly right. But then how to solve this problem?

【在 i*o 的大作中提到】
: Because double (similarly float) only has limited precision, the
: associative
: law for multiplication does not hold.
: In other words, following equation is NOT true for double.
: a*a*a*a = (a*a)*(a*a)
: The rounding error could become significant enough that two will have
: different results.
: For the same reason, many compile optimizations are not performed for
: equations involving double and floating.

avatar
H*e
18
我觉得逻辑上来说,iterative的没有recursive的intuitive,为什么大家逗这么喜欢
iterative呢

【在 B*******1 的大作中提到】
: 上个我收藏的火鸡的代码:
: public double power(double x, int n) {
: if (n < 0) return 1.0/power(x, -n);
: double r = 1.0, pow = x;
: while (n > 0) {
: if ( (1 & n) > 0 ) r *= pow;
: n >>= 1;
: pow *= pow;
: }
: return r;

avatar
A*c
19
因为iterative没有recursive的stack overhead。

【在 H***e 的大作中提到】
: 我觉得逻辑上来说,iterative的没有recursive的intuitive,为什么大家逗这么喜欢
: iterative呢

avatar
n*n
20
上面有几位问a=0的情况,这不算special case,完全不用单独考虑,因为0^0=1。
另外,这题应该考虑到overflow如何处理,这是这类题经常考察的一点。

【在 b***t 的大作中提到】
: 就问了 double pow(double a, int b);
: 下面是我给的code:
: {
: if (b==0) return 1;
: if (b==1) return a;
: int c = abs(b);
: double results=pow(a,c/2);
: results=results*results;
: results=(c%2 ==0)?results:results*a;
: if (b<0) return 1/results;

avatar
d*o
21
那这道题怎么做?
double的最大值。。。

【在 n*****n 的大作中提到】
: 上面有几位问a=0的情况,这不算special case,完全不用单独考虑,因为0^0=1。
: 另外,这题应该考虑到overflow如何处理,这是这类题经常考察的一点。

avatar
m*t
22
avatar
q*x
23
google newton method

【在 H***e 的大作中提到】
: 我觉得逻辑上来说,iterative的没有recursive的intuitive,为什么大家逗这么喜欢
: iterative呢

avatar
H*e
24

看错了

【在 q****x 的大作中提到】
: google newton method
avatar
H*e
25
double diff = ans * ans - n;
这个还是可能超出Double.Max的范围的吧?

【在 f*******t 的大作中提到】
: 练习时写的,开方数支持小数和负数
: double sqrt(double n)
: {
: if(n <= 0.0)
: return 0.0;
:
: double ans = n / 2.0;
: int round = 0;
: const double epsilon = 0.00001;
: while(true) {

avatar
b*t
26
floating point的这些越界就不用太管了 不然code写起来太恶心了

【在 H***e 的大作中提到】
: double diff = ans * ans - n;
: 这个还是可能超出Double.Max的范围的吧?

avatar
w*z
27
我孤陋寡闻,谁想出来的:
(ans + n/ans) /2
要是在面试时,能当场写出这个,如果没见过?如果见过的话,回答出来也没有多大意
义了。面试官也不傻。
实在不觉的这有啥好写的。Java math lib has the implementation of sqrt, 干嘛要
自己写?
要考你越界处理?研究这样的题,说实话对工作有啥帮助?

【在 f*******t 的大作中提到】
: 练习时写的,开方数支持小数和负数
: double sqrt(double n)
: {
: if(n <= 0.0)
: return 0.0;
:
: double ans = n / 2.0;
: int round = 0;
: const double epsilon = 0.00001;
: while(true) {

avatar
b*t
28
en 其实是看知识面
这个是数值算法
比如还有用+ - *来实现 /
通常可以会用逐位相减来做
也可以用newton法来做

【在 w**z 的大作中提到】
: 我孤陋寡闻,谁想出来的:
: (ans + n/ans) /2
: 要是在面试时,能当场写出这个,如果没见过?如果见过的话,回答出来也没有多大意
: 义了。面试官也不傻。
: 实在不觉的这有啥好写的。Java math lib has the implementation of sqrt, 干嘛要
: 自己写?
: 要考你越界处理?研究这样的题,说实话对工作有啥帮助?

avatar
f*t
29
反正这是面试时可能会考到的题,你是准备还是不准备呢?

【在 w**z 的大作中提到】
: 我孤陋寡闻,谁想出来的:
: (ans + n/ans) /2
: 要是在面试时,能当场写出这个,如果没见过?如果见过的话,回答出来也没有多大意
: 义了。面试官也不傻。
: 实在不觉的这有啥好写的。Java math lib has the implementation of sqrt, 干嘛要
: 自己写?
: 要考你越界处理?研究这样的题,说实话对工作有啥帮助?

avatar
w*z
30
http://stackoverflow.com/questions/825221/where-can-i-find-the-
It's a math problem more than CS. Well, don't know how far you want to go..
That is the implementation from math lib
public static double sqrt(double a) {
return StrictMath.sqrt(a); // default impl. delegates to StrictMath
// Note that hardware sqrt instructions
// frequently can be directly used by JITs
// and should be much faster than doing
// Math.sqrt in software.
}
The class StrictMath contains methods for performing basic numeric
operations such as the elementary exponential, logarithm, square root, and
trigonometric functions.
To help ensure portability of Java programs, the definitions of some of the
numeric functions in this package require that they produce the same results
as certain published algorithms. These algorithms are available from the
well-known network library netlib as the package "Freely Distributable Math
Library," fdlibm. These algorithms, which are written in the C programming
language, are then to be understood as executed with all floating-point
operations following the rules of Java floating-point arithmetic.
The Java math library is defined with respect to fdlibm version 5.3. Where
fdlibm provides more than one definition for a function (such as acos), use
the "IEEE 754 core function" version (residing in a file whose name begins
with the letter e). The methods which require fdlibm semantics are sin, cos,
tan, asin, acos, atan, exp, log, log10, cbrt, atan2, pow, sinh, cosh, tanh,
hypot, expm1, and log1p.
So by finding the appropriate version of the fdlibm source, you should also
find the exact implementation used by Java (and mandated by the
specification here).
The implementation used by fdlibm is
static const double one = 1.0, tiny=1.0e-300;
double z;
int sign = (int)0x80000000;
unsigned r,t1,s1,ix1,q1;
int ix0,s0,q,m,t,i;
ix0 = __HI(x); /* high word of x */
ix1 = __LO(x); /* low word of x */
/* take care of Inf and NaN */
if((ix0&0x7ff00000)==0x7ff00000) {
return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
sqrt(-inf)=sNaN */
}
/* take care of zero */
if(ix0<=0) {
if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
else if(ix0<0)
return (x-x)/(x-x); /* sqrt(-ve) = sNaN */
}
/* normalize x */
m = (ix0>>20);
if(m==0) { /* subnormal x */
while(ix0==0) {
m -= 21;
ix0 |= (ix1>>11); ix1 <<= 21;
}
for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
m -= i-1;
ix0 |= (ix1>>(32-i));
ix1 <<= i;
}
m -= 1023; /* unbias exponent */
ix0 = (ix0&0x000fffff)|0x00100000;
if(m&1){ /* odd m, double x to make it even */
ix0 += ix0 + ((ix1&sign)>>31);
ix1 += ix1;
}
m >>= 1; /* m = [m/2] */
/* generate sqrt(x) bit by bit */
ix0 += ix0 + ((ix1&sign)>>31);
ix1 += ix1;
q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */
r = 0x00200000; /* r = moving bit from right to left */
while(r!=0) {
t = s0+r;
if(t<=ix0) {
s0 = t+r;
ix0 -= t;
q += r;
}
ix0 += ix0 + ((ix1&sign)>>31);
ix1 += ix1;
r>>=1;
}
r = sign;
while(r!=0) {
t1 = s1+r;
t = s0;
if((ts1 = t1+r;
if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1;
ix0 -= t;
if (ix1 < t1) ix0 -= 1;
ix1 -= t1;
q1 += r;
}
ix0 += ix0 + ((ix1&sign)>>31);
ix1 += ix1;
r>>=1;
}
/* use floating add to find out rounding direction */
if((ix0|ix1)!=0) {
z = one-tiny; /* trigger inexact flag */
if (z>=one) {
z = one+tiny;
if (q1==(unsigned)0xffffffff) { q1=0; q += 1;}
else if (z>one) {
if (q1==(unsigned)0xfffffffe) q+=1;
q1+=2;
} else
q1 += (q1&1);
}
}
ix0 = (q>>1)+0x3fe00000;
ix1 = q1>>1;
if ((q&1)==1) ix1 |= sign;
ix0 += (m <<20);
__HI(z) = ix0;
__LO(z) = ix1;
return z;
avatar
g*n
31
Mark
★ Sent from iPhone App: iReader Mitbbs Lite 7.39
avatar
z*c
32
试试写的短点。
double pow(double a, double b)
{
assert(a>0);
double result = 1.0;
if(b==0.0)
reutrn 1.0;
else if(b<0)
return pow(a,-b);
while(b > 0 && a > 0.000000001)
{
if(b>1)
{
result *= a;
b -= 1.0;
}
else if(b*2>1)
{
a = sqrt(a);
result *= a;
b = b*2 -1;
}
else
{
a = sqrt(a);
b *= 2;
}
}
return result;
}
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。