【发布时间】:2013-05-23 09:37:34
【问题描述】:
将浮点值缩放 10 以在计算期间保持精度总是精确的吗?
这个问题只适用于任何涉及的数字小于小于Math.pow (2,53)和大于大于Math.pow (10,-15),如@ 987654323@
我希望这能清除一些问题
0.3 - 0.2 //0.09999999999999998
明显不精确
但是在一个缩放的数字上做减法
var a = 0.3;
var b = 0.2;
var l = Math.max ("".split.call(a,".")[1].length,"".split.call(b,".")[1].length);
var c;
a *= Math.pow (10,l);
b *= Math.pow (10,l);
c = a-b;
c /= Math.pow(10,l);
console.log(c); //0.1
给出"精确的"结果。
问题是,当乘以 10 的幂 (其中 Math.pow ( 10 , n<16)<Math.pow(2,53)) 时,是否有 任何 浮点值,符合上述标准 f<Math.pow(10,-15), 不会导致double value nearest N(b)-N(a)?,当再次除以相同 10 的幂?
就像上面sn-p中描述的那样。
这只是一个有趣的问题,不是用来进行实际计算的,我只是好奇
对于误解,我不擅长这个解释的东西
【问题讨论】:
-
为什么不运行它?只有 9007199254740992 次迭代 :)
-
@mplungjan 仅当
b始终是相同的数字 =) -
大声笑。数学从来都不是我的强项 - 有趣的字符串转换和随后的十进制长度计数 +1
-
也许英语说得更好并且理解我想问的内容的人可以改写部分内容以避免误解? =)
-
关于 Edit3:所有小于 253 的 10 的非负幂都可以精确表示。正确的
pow实现会为这些情况返回准确的结果。考虑一个doublex,其中最低位集的值为 2**–d。乘以double时产生整数的十的最小幂是 10d。如果 10d 小于 253 且 10d•x 小于 253,则两者都是完全可表示的。那么按照 IEEE-754 浮点算术规范,10**d 和 x 的乘积是精确的。
标签: javascript floating-point scaling