据我所知,float可以精确地表示14个数字。
所以让我们假设我们有
a = 564214623154
b = 54252我们将这个c=a*b相乘,它应该是30609771735350808,但当编译它时,它显示3.0609771735351E+16,所以据我所知,它应该会失去一些精度,但当我用c除以c/a时,我得到了564214623154的准确结果,而没有任何精度损失
再举一个例子,假设我们有
c = 30609771735350808
d = 30609761111111111e=c-d应为10624239697,但在编译时显示为10624239696,因此会丢失精度
那么,只有当我减去或相加两个数字时,精度才会丢失吗?
如果重要的话,我使用php
发布于 2011-07-13 06:25:08
使用乘法和除法也有可能失去精度。PHP和JavaScript以IEEE754格式存储数字,尾数为52位,指数为11位。有些整数是精确表示的,有些则不是。
让我们试试这些:
在Real Math中(用Ruby生成):
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786167788在PHP和JavaScript中
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786168000所以我们也会损失乘法和除法的精确度。
编辑:在重新讨论OP的问题时,这似乎不是一个很好的答案,因为结果包含超过15个十进制数字的精度。如果问题的目的是将一组数字相乘和相除,其中每个数字都以15位或更少的精度表示,那么最终结果往往会保持很高的精度(前提是您不会溢出或下溢)。所以你可以将1.25E35 * 2.5E7相乘,得到精确的3.125e+42,因为PHP和JavaScript基本上会将有效数字的组相乘,并将指数相加。但是,如果将这两个值相加,则会得到1.25E35 + 2.5E7 = 1.25E35。没错,你给一个数字加上2500万,它就不会改变!这是因为,正如操作员所说,您只能获得14或15位小数位的精度。尝试通过写出120000000000000000000000000000000000 + 25000000来手动添加这两个值。14-15位数字从左边开始计数,你不能把它们都拿起来。
底线是精度问题更有可能与加法和减法一起出现。很高兴知道这一点。
https://stackoverflow.com/questions/6671853
复制相似问题