我看到了函数double frexp (double x, int* exp);
,它将双精度分为尾数(m)和指数(e),幂为2(1.m * 2^e
)。是否有类似的函数以10的幂返回值?像m * 10^e
这样的东西是完美的。
答案 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
),则可能就足够了。