c++ - 我们可以假设以下任何一对浮点算术语句总是产生相同的结果吗?

标签 c++ c floating-point floating-point-precision

给定以下具有任意值的浮点变量,在 c/c++ 中。

float a, b, c, d;

在下面的语句中,我们可以假设它们中的任何一对总是产生相同的结果吗?

float result_1 = a + b + c + d - c;
float result_2= a + b + c + (d - c);
float result_3 = a + b + d;

此外,是否对以下谓词有任何保证:

a + b - b == a

最佳答案

不,你不能假设这个。我打破了你所有的三个例子:(Live)

#include <iostream>

int main()
{
   double a = 1, b = 1e100, c= 1e100, d= 1, c2 = .1, d2 = -.1, b2 = 1;

   std::cout << ( a + b2 + c2 + d2 - c2 == a + b2 + c2 + (d2 - c2)) << "\n"
    << ( a + b2 + c + d - c == a + b2 + d) << "\n"
    << ( a == a + b -b);
}

输出:

0 0 0

==!= 在浮点类型上总是不安全的,因为它们有舍入错误。

关于c++ - 我们可以假设以下任何一对浮点算术语句总是产生相同的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943314/

相关文章:

c++ - Call by pointer 变成 call by reference to pointer

c - 如何使用定义预处理器来定义函数指针?

c++ - 具有大值跨度的 double 组求和 : proper algorithm

c++ - Netbeans 7.3 构建主机 c/cpp

c - 在 20 层有约束条件下爬 n 层楼梯的可能性

c++ - 使用 IEEE 754 浮点 double 据类型安全往返整数值

python - 字符串转 float 错误

C++ 整数后跟 char 被接受为输入

c++ - 有趣的问题(货币套利)

c++ - gdiplus 从字符串构造图像