给定两个不同的字符串string s1
和string 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;
}
我尝试了 s1
和 s2
的不同值,看起来确实如此,但也有一个强有力的保证,特别是对于无法表示的非常大或很小的数字的字符串与 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/