C++ stod:字符串到浮点转换是否一致
C++ stod: Is the string to float conversion consistent
给定两个不同的字符串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
使用不同的值,似乎是这样,但也有很强的保证,特别是对于数字非常大或很小的字符串,这些字符串不能完全表示为双精度值,因此将四舍五入到下一个可表示的双精度值。如果最小的较大和最大的较小可表示值与字符串中的目标数字相距相等,该怎么办?尾随零是否会干扰转换函数stod
,即使用额外的尾随零时,选择的双精度表示与没有它们的双精度表示不同?换句话说:从字符串到双精度的转换是否一致?
C(因为至少C99)指定了对IEC 60559(IEEE 754)的可选支持。 如果实现定义了__STDC_IEC_559__
(当前的GCC和Clang似乎定义了这些规则,至少如果包含math.h
),那么它必须遵循使浮点运算更可靠的其他规则。 其中之一是(最多DECIMAL_DIG
位数字,对于大多数现代实现来说至少为 17 位)strtod
正确舍入,这意味着对问题的肯定答案。
相关文章:
- 是否可以从int转换为enum类类型
- 隐式转换是否应该在模板参数的上下文中工作?
- C++ stod:字符串到浮点转换是否一致
- 自动(toCast)显式转换是否计划在未来C++标准?
- 类类型的左值到右值转换:是否涉及复制?
- 矢量之间的转换是否定义了行为
- 如何检测 W2A 转换是否完全成功
- interpret_cast和c样式强制转换是否兼容(按照c++标准)
- 仅更改常量性的指针强制转换是否可以调用未定义的行为
- C++ 强制转换是否会创建新对象
- 在类树中使用动态强制转换是否可以接受
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 检查显式强制转换是否成功
- 如果派生类只包含方法(没有成员变量),向下强制转换是否安全?
- 使用这种智能指针强制转换是否安全?
- 类型转换是否消耗额外的CPU周期?
- 在void*和void*之间进行强制转换时,混合使用静态强制转换和重新解释强制转换是否不安全?
- 类型转换是否在内部使用条件?(C / c++, c#)
- 如何检测转换是否在 c++0x 中失败
- 如何在CRTP中实现向下转换是否有效的编译时检查