C++ 斯托德 : Is the string to float conversion consistent

标签 c++ floating-point precision

给定两个不同的字符串string s1string s2,它们包含相同的十进制数,但小数点后的尾随零数量不同,是否始终保证stod(s1)==stod(s2)?

例如:

#include<iostream>

using namespace std;

bool equalConversion(const string& s1,const string& s2)
{
    return stod(s1)==stod(s2);
}

int main(int argc, char *argv[])
{
    string s1="0.1232340";
    string s2="0.12323400";

    cout<<"equal conversion: "<<equalConversion(s1,s2)<<endl;
    return 0;
}

我尝试了 s1s2 的不同值,看起来确实如此,但也有一个强有力的保证,特别是对于无法表示的非常大或很小的数字的字符串与 double 值完全相同,因此将四舍五入到下一个可表示的 double 值。如果最小的较大可表示值和最大的较小可表示值距离字符串中的目标数字同样远怎么办?尾随零是否会干扰转换函数 stod ,从而导致使用附加尾随零时所选择的 double 表示与没有尾随零时选择的 double 表示不同?换句话说:从 string 到 double 的转换是否一致?

最佳答案

C(至少自 C99 起)指定对 IEC 60559 (IEEE 754) 的可选支持。如果执行defines __STDC_IEC_559__ — 当前的 GCC 和 Clang 似乎定义了这一点,至少在包含 math.h 的情况下 — 它必须遵守使浮点运算更加可靠的附加规则。其中之一是(最多 DECIMAL_DIG 位,对于大多数现代实现而言至少为 17)strtod 已正确舍入,这意味着问题的答案是肯定的。

关于C++ 斯托德 : Is the string to float conversion consistent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58824869/

相关文章:

python - 在 ndarray 中查找 float

c++ - 具有多种类型的类数组?如何访问数组中的一种类型?

c++ - 避免使用 Google Mock 调用基类

javascript - 如何从 float 中 chop 多余的零

c# - 我是疯了还是 Math.Pow 坏了?

php - MySQL如何在使用除法时保留精度?

java - 将 log4j 与 SWIG/JNI 集成?

c++ - 我们可以实现一个 max 或 min 宏,它可以接受可变参数(超过两个参数)

Javascript 浮点减法

c++ - double 值的不精确性是否保证在同一台机器上是一致的?