【发布时间】:2015-10-08 13:17:36
【问题描述】:
每种情况下的语句在数学上是等价的。我的问题是在编码时选择哪一个更好。代码的哪一部分可能导致某些变量范围的溢出,而另一部分对于相同的范围没有溢出。代码的哪一部分更精确,为什么?
double x, y, z;
//case 1
x = (x * y) * z;
x *= y * z;
//case 2
z = x + x*y;
z = x * ( 1.0 + y);
//case 3
y = x/5.0;
y = x*0.2;
【问题讨论】:
-
你应该阅读浮点运算。通过简单的搜索即可找到足够的信息。
-
如果您的项目需要通过强制执行某种编码风格来最大化浮点精度,那么可能会出现问题。
-
What Every Computer Scientist Should Know About Floating-Point Arithmetic。
x/5.0会更精确,因为 0.2 不能用二进制浮点表示,但x*0.2会更快 -
"...由于上溢和下溢问题而安全" 除非您知道要处理的数字有多大,否则这是没有意义的。您的意思是问哪些行可能存在浮点不准确问题?
-
例如,
(0.000001 * 100000000) * 10000000不会导致我的计算机溢出,而0.000001 * (100000000 * 10000000)会。我还想考虑浮点数的不准确性。
标签: c++ c double overflow underflow