如何获得10的幂的尾数和指数?

时间:2015-04-09 11:48:03

标签: c floating-point double double-precision

我看到了函数double frexp (double x, int* exp);,它将双精度分为尾数(m)和指数(e),幂为2(1.m * 2^e)。是否有类似的函数以10的幂返回值?像m * 10^e这样的东西是完美的。

1 个答案:

答案 0 :(得分:6)

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

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

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


注意:如果你想要的是将x转换为十进制,则问题是studied in depth。正确舍入到十进制的第一步是来计算基数十位有效数作为浮点数(在所有情况下都不是;对于某些输入,这可以是可接受的快捷方式),因为在一般情况下,此步骤将引入对于正确舍入的转换函数不允许的近似值。对于快速而又脏的转换为十进制例程(如果您可以访问log10而不是sprintf),则可能就足够了。

相关问题