我曾经认为float
可以使用逗号后的最大6位数和double
15。但是,如果我打印限制here:
typedef std::numeric_limits<float> fl;
typedef std::numeric_limits<double> dbl;
int main()
{
std::cout << fl::max_digits10 << std::endl;
std::cout << dbl::max_digits10 << std::endl;
}
打印float
9和double
17?
答案 0 :(得分:3)
您会混淆digits10
和max_digits10
。
如果digits10
为6,那么任何带有六位十进制数的数字都可以转换为浮点类型,然后返回,当舍入到六位小数时,会生成原始数字值。
如果max_digits10
为9,则至少存在两个浮点数,转换为十进制时产生相同的初始8位小数。
digits10
是您要查找的号码,具体取决于您的说明。它是关于从十进制转换为二进制浮点回到十进制。
max_digits10
是一个关于从二进制浮点数转换为十进制数到二进制浮点数的数字。
答案 1 :(得分:2)
来自cppreference:
与大多数数学运算不同,只要至少使用max_digits10(浮点数为9,双数为17),浮点值到文本和返回的转换就是精确的:保证生成相同的浮点值,即使中间文本表示不精确。可能需要超过一百个十进制数字来表示十进制表示法中浮点的精确值。
例如(我使用http://www.exploringbinary.com/floating-point-converter/来促进转换)和double作为精度格式:
1.1e308 =&gt; 109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400
使用16位有效数字:
1.099999999999999e308 =&gt; 109999999999999897424000903433019889783160462729437595463026208549681185812946033955861284690212736971153169019636833121365513414107701410594362313651090292197465320141992473263972245213092236035710707805906167798295036672550192042188756649080117981714588407890666666245533825643214495197630622309084729180160
使用17位有效数字:
1.0999999999999999e308 =&gt; 109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400
与原始
相同超过17位有效数字:
1.09999999999999995555e308 =&gt; 109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400
继续与原作相同。
答案 2 :(得分:0)
十进制数字和二进制数字之间没有确切的对应关系。
IEEE 754单精度使用23位加1表示隐式前导1.双精度使用52 + 1位。
要获得等效的小数精度,请使用
log10(2 ^ binary_digits)= binary_digits * log10(2)
对于单精度,这是
24 * log10(2)= 7.22
和双精度
53 * log10(2)= 15.95
请参阅here以及我发现的Wikipedia page并不是特别简洁。