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

fc6*_*c67 2 c floating-point double double-precision

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

Pas*_*uoq 6

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

没有相同的理由突出显示十次幂分解函数.实际上,定义这样一个函数会带来许多技术障碍:并非所有十个幂都可以完全表示为double:0.1和10 23 不是.对于基十尾数部分,你要当乘以10到达接近参数的值ê,或10的双精度逼近è?一些浮点值可能具有几个同等有效的分解.某些浮点值可能没有分解.

如果这些准确性和规范性方面对您无关紧要,请使用e = floor(log10(abs(x)))base-10-exponent(或ceil更像PDP-11-style的约定frexp),以及x / pow(10, e)base-10-significand.如果重要性在1到10之间对你很重要,你最好通过夹紧来强制这个属性.


注意:如果你想要的是转换x为十进制,问题已经深入研究.正确舍入到十进制的第一步不是将基数十位有效数计算为浮点数(在所有情况下都不计算;对于某些输入,这可能是一个可接受的快捷方式)因为在一般情况下,这一步会引入对于正确舍入的转换函数不允许的近似值.对于快速和脏转换为十进制例程(在您有权访问log10但不能访问的情况下sprintf),这可能就足够了.