C 如何以10的幂得到一个双精度的尾数和指数?

C 如何以10的幂得到一个双精度的尾数和指数?,c,floating-point,double,double-precision,C,Floating Point,Double,Double Precision,我看到函数double frexp(double x,int*exp),它将双精度分解为尾数(m)和指数(e),幂为2(1.m*2^e)。是否有类似的函数以10的幂返回值?类似于m*10^e的东西将是完美的。关于frexp的事情是,如果您使用的是IEEE 754二进制浮点(or),它只会显示浮点值的表示形式。因此,分解是精确的,并且是双射的:您可以根据获得的有效位和指数重新构造参数 不存在突出显示十次幂分解函数的等效理由。实际上,定义这样一个函数会带来一些技术障碍:并不是所有的十次幂都能精确地表

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

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

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

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


注意:如果要将
x
转换为十进制,则问题已经解决。正确四舍五入转换为十进制的第一步是计算以10为基数的有效位作为浮点数(并非在所有情况下;对于某些输入,这可能是一种可接受的快捷方式),因为在一般情况下,这一步将引入对正确舍入的转换函数不允许的近似值。对于快速且脏的十进制例程转换(如果您可以访问
log10
,但不能访问
sprintf
),这可能就足够了