【发布时间】:2018-03-30 08:17:05
【问题描述】:
这不是著名的Is floating point math broken 的复制品,即使它乍一看很像。
我正在使用fscanf(file, "%lf", &value); 从文本文件中读取double,并将其与== 运算符与双字面值进行比较。如果字符串与文字相同,那么使用== 的比较是否在所有情况下都是true?
示例
文本文件内容:
7.7
代码sn-p:
double value;
fscanf(file, "%lf", &value); // reading "7.7" from file into value
if (value == 7.7)
printf("strictly equal\n");
预期和实际输出是
strictly equal
但这假设编译器将双精度字面值7.7 转换为双精度值,其方式与 fscanf 函数完全相同,但编译器可能使用也可能不使用相同的库将字符串转换为双精度值。
或者另外问:从字符串到双精度的转换是否会产生唯一的二进制表示,或者可能存在轻微的实现相关差异?
【问题讨论】:
-
为什么不首先使用std::strtod,因为C++?
-
@ron 是的,可以使用 std::strtod ,但问题仍然存在。它适用于 C 和 C++。
-
尝试阅读其中的一些内容(他们将开始解释一些浮点和库问题):randomascii.wordpress.com/category/floating-point 特别是:randomascii.wordpress.com/2013/07/16/floating-point-determinism
-
对任何关于浮点数学的问题扔Is floating point math broken? 或What Every Computer Scientist Should Know About Floating-Point Arithmetic 就像对任何C 问题扔C 标准一样。
-
我认为没有明确的答案。这是 IMO 的 QOI 问题。我认为它很可能不会产生相同的二进制表示一般。
标签: c++ c floating-point language-lawyer