这不是著名的 Is floating point math broken 的复制品,即使第一眼看上去很像。
我正在使用 fscanf(file, "%lf", &value);
从文本文件中读取 double
并将其与 == 进行比较
运算符针对双字面值。如果字符串与文字相同,那么使用 ==
的比较是否在所有情况下都是 true
?
示例
文本文件内容:
7.7
代码片段:
double value;
fscanf(file, "%lf", &value); // reading "7.7" from file into value
if (value == 7.7)
printf("strictly equal\n");
预期和实际输出是
strictly equal
但这假设编译器将 double 字面值 7.7
转换为 double 值,其方式与 fscanf
函数完全相同,但编译器可能使用也可能不使用用于将字符串转换为 double 的相同库。
或者另外问:从字符串到 double 的转换是否会产生唯一的二进制表示,或者可能存在轻微的依赖于实现的差异?
最佳答案
来自 c++ 标准:
[lex.fcon]
... If the scaled value is in the range of representable values for its type, the result is the scaled value if representable, else the larger or smaller representable value nearest the scaled value, chosen in an implementation-defined manner...
强调我的。
因此,只有当值可以用 double 严格表示时,您才能依赖相等性。
关于c++ - 比较从字符串转换的浮点值与文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810474/