Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 浮点数运算_Floating Point_Precision - Fatal编程技术网

Floating point 浮点数运算

Floating point 浮点数运算,floating-point,precision,Floating Point,Precision,几天前,我们在课堂上讨论了浮点数。所以在一些编程语言中有一个表达式需要检查: 0.1 + 0.2 == 0.3 返回的为false。但是尝试 100*0.1 + 100*0.2 == 100*0.3 返回真 所以,实际上我知道的是,0.1不能精确表示(0.0001100110011…),这里出现了一些错误。但为什么第二个表达是正确的呢?为什么与100相乘有效 还有一个很好的问题,为什么这个表达式不是0?手术有诀窍吗 >>> math.exp(6)/10 - math.ex

几天前,我们在课堂上讨论了浮点数。所以在一些编程语言中有一个表达式需要检查:

0.1 + 0.2 == 0.3
返回的为false。但是尝试

100*0.1 + 100*0.2 == 100*0.3 
返回

所以,实际上我知道的是,0.1不能精确表示(0.0001100110011…),这里出现了一些错误。但为什么第二个表达是正确的呢?为什么与100相乘有效

还有一个很好的问题,为什么这个表达式不是0?手术有诀窍吗

>>> math.exp(6)/10 - math.exp(6)*0.1
-7.105427357601002e-15

例如,大多数编程语言中使用的双精度浮点数字集大致上是+/-m*2^k的数字集,其中m是从2^52到2^53的整数,k是从-1024到+1024的整数。像0.1这样的数字不在该集合中。任何整数乘以或除以二的幂永远不等于0.1

任何浮点计算都会计算精确的结果,然后将其四舍五入到最接近的浮点数

将0.1+0.2与0.3进行比较时,实际上是取最接近0.1的浮点数和最接近0.2的浮点数,相加,将结果四舍五入到最接近的浮点数,然后与最接近0.3的浮点数进行比较

这两个结果将非常接近。它们是否相等,或者一个结果较小还是另一个结果较小,或多或少都是巧合。如果对100*0.1、100*0.2和100*0.3执行相同的操作,则会发生相同的情况。你会得到两个非常接近的数字,它们是相等的,还是一个或另一个更小,这或多或少是巧合


在上一个问题中,第一个表达式除以10。第二个数乘以最接近0.1的浮点数。没有等于0.1的浮点数,最近的浮点数略大于或小于0.1。因此,结果将非常接近(它们是),但不能保证它们是相同的

@HristoYankov:这似乎很无知。请阅读一篇不需要重复的摘要,以及进一步文档的链接