Binary 表示为十进制数的二进制浮点数

Binary 表示为十进制数的二进制浮点数,binary,floating-point,numbers,decimal,ieee-754,Binary,Floating Point,Numbers,Decimal,Ieee 754,并非所有的十进制数都可以用二进制浮点数精确表示 有两个原因可以解释为什么一个真实的数字可能不准确 可表示为浮点数。最常见的情况是 用小数0.1表示。虽然它有一个有限的 十进制表示法,在二进制中,它有一个无限重复 代表性 反过来呢?如果使用了足够多的数字,每个IEEE 754浮点是否可以使用十进制数精确表示?是的,如果使用了足够多的数字,每个有限的IEEE 754浮点是否可以使用十进制数精确表示 每个额外的二进制精度数字最多需要一个额外的十进制精度数字来准确表示 例如: 0.1b ->

并非所有的十进制数都可以用二进制浮点数精确表示

有两个原因可以解释为什么一个真实的数字可能不准确 可表示为浮点数。最常见的情况是 用小数0.1表示。虽然它有一个有限的 十进制表示法,在二进制中,它有一个无限重复 代表性


反过来呢?如果使用了足够多的数字,每个IEEE 754浮点是否可以使用十进制数精确表示?

是的,如果使用了足够多的数字,每个有限的IEEE 754浮点是否可以使用十进制数精确表示

每个额外的二进制精度数字最多需要一个额外的十进制精度数字来准确表示

例如:

0.1b   -> 0.5
0.01b  -> 0.25
0.11b  -> 0.75
0.001b -> 0.125
介于1和2之间的双精度(binary64)数字只需要点后52位十进制数字即可准确表示:

#include <stdio.h>

int main(void) {
  printf("%.55f\n", 1.1);
}
在上面表示的末尾显示的四个之后都是零。1.1000000000000088817841970012523233890533447265625是最接近11/10的双精度的精确值


正如下面的评论所指出的,负指数的每一个额外的数量单位也需要一个额外的十进制数字来准确表示。但大幅度的负指数在其十进制表示中有前导零。最小的次正常数将在点后有1022+52个十进制数字,但这些数字中的前一个接近1022*log10(2)的数字将是零。

是的,如果使用了足够的数字,每个有限的IEEE 754浮点将使用十进制数字精确表示

每个额外的二进制精度数字最多需要一个额外的十进制精度数字来准确表示

例如:

0.1b   -> 0.5
0.01b  -> 0.25
0.11b  -> 0.75
0.001b -> 0.125
介于1和2之间的双精度(binary64)数字只需要点后52位十进制数字即可准确表示:

#include <stdio.h>

int main(void) {
  printf("%.55f\n", 1.1);
}
在上面表示的末尾显示的四个之后都是零。1.1000000000000088817841970012523233890533447265625是最接近11/10的双精度的精确值


正如下面的评论所指出的,负指数的每一个额外的数量单位也需要一个额外的十进制数字来准确表示。但大幅度的负指数在其十进制表示中有前导零。最小的次正常数在点后有1022+52个十进制数字,但这些数字中的前一个接近1022*log10(2)的数字将是零。

@Jongware负指数的每一个额外的数量单位也需要一个额外的十进制数字来准确表示。我将把数学作为一个练习留给读者1/(2^24),但如果它非常接近24,我不会感到惊讶。除非你不想计算前导零,否则你需要减去24*log10(2)或类似的东西。@jongware1/(2^24)是0.000000059604644775390625,小数点后24位,其中7位为前导零。@Jongware负指数的每一个额外的数量单位也需要一个额外的十进制数字来准确表示。我将把数学作为一个练习留给读者1/(2^24),但如果它非常接近24,我不会感到惊讶。除非你不打算计算前导零,否则你需要减去24*log10(2)或类似的东西。@Jongware 1/(2^24)是0.000000059604644775390625,小数点后24位,其中7位是前导零。@harold一些双精度数字需要大约750位小数(或多或少52+1022*(1-log10(2)))@哈罗德,当我说52+1022*(1-log10(2))时,我不是在数它们,但如果我想数它们,那就是52+1022。不计算前导零很容易:有效位中的每个二进制数字和负指数的每个单位加上一个十进制数字的需要。@harold此人说767。“1-log10(2)”是一个粗略的近似,而不是一门精确的科学@harold有些双精度数字需要大约750个十进制数字(或多或少52+1022*(1-log10(2))@harold当我说52+1022*(1-log10(2))时,我没有计算它们,但如果我想计算它们,它将是52+1022。不计算前导零很容易:有效位中的每个二进制数字和负指数的每个单位加上一个十进制数字的需要。@harold此人说767。“1-log10(2)”是一个粗略的近似,而不是一门精确的科学。