二进制数表示

AMC*_*der 7 c floating-point binary computer-architecture

首先,这不是关于精度或类似问题的问题.

我的问题是,编译器如何决定如何表示数字?

我们以C为例.我写

double d = 4.5632;
Run Code Online (Sandbox Code Playgroud)

它如何选择二进制表示?我知道它没有完全代表,所以它如何选择最接近的可表示数字?它是在编译时完成的吗?它是由CPU还是操作系统完成的?

,如果你知道这是如何发生只能回答,就像回答"不担心"也没有什么帮助.此外,"它取决于平台"也没有帮助,你可以选择一个平台并解释.

Oli*_*rth 6

编译器不会(通常)决定.CPU(通常)具有浮点单元,该浮点单元要求以特定格式(通常为IEEE-754)表示浮点值.当然,可以模拟完全不同的体系结构,在这种情况下,编译器/模拟器作者可以自由选择完全不同的表示.但这不典型.

至于如何将特定的词汇表示4.5632转换为基础表示,这是由C标准指定的.因此,从C99标准的6.4.4.2节(我突出了最相关的部分):

有效数部分被解释为(十进制或十六进制)有理数; 指数部分中的数字序列被解释为十进制整数.对于十进制浮点常数,指数表示有效位部分要缩放的10的幂.对于十六进制浮点常量,指数表示有效位部分要缩放的2的幂.对于十进制浮点常量,以及当FLT_RADIX不是2的幂时的十六进制浮点常量,结果是最接近的可表示值,或者与实现定义中选择的最接近的可表示值紧邻的更大或更小的可表示值方式.对于十六进制浮点常量,当FLT_RADIX是2的幂时,结果被正确舍入.

这将在编译时完成(虽然标准没有强制要求).