如何获得 10 次方的双倍数的尾数和指数?

How to get the mantissa and exponent of a double in a power of 10?

我看到了函数 double frexp (double x, int* exp);,它将一个双精度数拆分为尾数 (m) 和指数 (e),其次方为 2 (1.m * 2^e)。有没有类似returns10次方的值的函数?像 m * 10^e 这样的东西就完美了。

关于 frexp 的事情是,如果您使用 IEEE 754 二进制浮点数(或 PDP-11 floating-point),它只会显示浮点值的表示形式。因此,分解是精确的,并且是双射的:您可以根据获得的有效数和指数重构参数。

不存在突出显示十次幂分解函数的等效理由。实际上,定义这样一个函数会带来许多技术障碍:并非所有 10 的幂都可以精确表示为 double:0.1 和 1023 aren't。对于以 10 为底的有效数部分,您想要一个在乘以 10e 或乘以 10 的双精度近似值时接近参数的值e?一些浮点值可能有几个同样有效的分解。某些浮点值可能没有分解。

如果这些准确性和规范性方面对您来说无关紧要,请使用 e = floor(log10(abs(x))) 作为以 10 为底的指数(或 ceil 作为更像 PDP-11 样式的约定 frexp) 和 x / pow(10, e) 表示基数为 10 的有效数字。如果有效数在 1 到 10 之间对你很重要,你最好通过钳位来强制这个 属性。


注意: 如果您想要将 x 转换为十进制,则问题已 studied in depth。正确四舍五入转换为十进制的第一步是 not 计算以 10 为底的有效数作为浮点数(无论如何不是在所有情况下;对于某些输入,这是可以接受的捷径),因为在一般情况下,此步骤会引入近似值,而这些近似值对于正确舍入的转换函数来说是不允许的。对于快速转换为十进制例程(在您可以访问 log10 但不能访问 sprintf 的情况下),这可能就足够了。