【问题标题】:C++ stod: Is the string to float conversion consistentC ++ stod:字符串到浮点转换是否一致
【发布时间】:2019-11-12 18:47:47
【问题描述】:

给定两个不同的字符串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 使用不同的值,看起来确实如此,但也有一个强有力的保证,特别是对于不能精确表示为双精度值的非常大或小数字的字符串,因此会被四舍五入到下一个可表示的双精度值。如果最小的较大和最大的较小可表示值距离字符串中的目标数字同样远怎么办?尾随零是否会干扰转换函数stod,使得附加尾随零所选择的双重表示不同于没有它们时选择的双重表示?换句话说:从字符串到双精度的转换是否一致一致

【问题讨论】:

  • 对于strtod,ISO C++11 参考了 ISO C 标准。其相关部分是 7.20.1.3。并在其中特别编号为第 9 段。根据我的阅读,它似乎无法提供您正在寻找的一致性保证。

标签: c++ floating-point precision


【解决方案1】:

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

【讨论】:

  • “肯定回答”是指在此支持下,最多 17 位的答案是“是”,如果没有此支持,它可能是“否”?
  • @phinz:我的意思是这是我所知道的唯一可移植保证;尽管如此,看到一个实现实际上对尾随的 0 做出反应还是会令人惊讶。
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2011-11-25
  • 2019-06-22
相关资源
最近更新 更多