c++ - 比较从字符串转换的浮点值与文字

标签 c++ c floating-point language-lawyer

这不是著名的 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 的转换是否会产生唯一的二进制表示,或者可能存在轻微的依赖于实现的差异?

Live demonstration

最佳答案

来自 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/

相关文章:

c - 如何在 C 函数中查找字符串的大小?

java - 为什么 Java 的 Double.compare(double, double) 是这样实现的?

c - C中的多线程死锁

c++ - 通过 texture2D 函数使用自动比较从阴影贴图纹理中采样数据

c++ - 来自命名管道的ifstream-检查是否无阻塞,是否有数据

c++ - 在抛出 'std::out_of_range' what(): basic_string::substr 实例后终止调用

c - 替代终端的 Bison/Flex 打印值

c - 将非规范化数字除以 2

c++ - 奇怪的! linux 和 windows sprintf float 到文件

c++ - 使用模板构建哨兵节点 - C++