C 计算浮点数的位数

C 计算浮点数的位数,c,performance,math,floating-point,digits,C,Performance,Math,Floating Point,Digits,是否有任何有效的方法(不将浮点转换为字符串)来获得一个浮点数所包含的位数(与它的长度和精度无关) 通过这种方式,我可以实现一个相当好的、可移植的、无问题的比较/调节功能,方法是将浮点数乘以它所包含的位数。Q:有没有有效的方法来获得浮点数的位数? A:我怀疑 每个有限FP数都是精确的,但可能不是人们所认为的精确值 由于典型的双, double x=0.53,x值:.5300000000266453525910037569701671600341796875,52位。 double x=0.1,x

是否有任何有效的方法(不将浮点转换为字符串)来获得一个浮点数所包含的位数(与它的长度和精度无关)



通过这种方式,我可以实现一个相当好的、可移植的、无问题的比较/调节功能,方法是将浮点数乘以它所包含的位数。

Q:有没有有效的方法来获得浮点数的位数?
A:我怀疑

每个有限FP数都是精确的,但可能不是人们所认为的精确值

由于典型的

double x=0.53
x
值:
.5300000000266453525910037569701671600341796875
,52位。
double x=0.1
x
值:
.10000000000000055115123125782702118158340451015625
55位。
与数学
0.1
最接近的
double
.09999999999167332731531132594682276248931884765625
,共56位

DBL_MAX
:十进制,通常约300位
17976931348623158…
6728515625结尾。

DBL_MIN
:通常
0.000000(~300个零)222573858585072014。。。(可能还有700位左右)

FP数字的比较不需要确定十进制数字的数量。要比较FP编号,请使用常用的关系运算符
>、>=、==


这些值是说明性的。YMMV.

你是说1.2有2个,1.21有3个?基本上,数字在0开始的地方或达到精度的时候结束?PI的长度是多少?因为代码中的
0.1
并不完全是数学数字
0.1
,您期望它的位数是多少?你的想法有问题,使问题变得不清楚。那
0.10000000000003
呢?因为如果您试图将
0.1
打印为
double
,您可能会得到这样的结果@Malina
1.00001
很少能准确地表示为
double
。相反,
100001*100000=100001
在典型的C中完成,如
1.0000010000065512040237081237137317657470703125*100000
,并将乘积四舍五入到最接近的
双精度
:结果是
100001
。如果你尝试其他类似的乘法,由于1)FP数的二进制实现和2)乘积的四舍五入,您可能会遇到一个不等于预期结果的结果。我的想法的问题是
12,5*100=1250
,这也是
0125*1000=1250
Malina的结果。当然,您可以找到具有简单精确表达式的选择数十进制表示法,如12.5,但不是0.53或0.1。一般来说,您很快就会遇到FP编号的问题。正如@ydobonebi所评论的,大多数FP数字在精确打印时都有许多十进制数字。当然,代码可以四舍五入到5或6位,但代码开头只有近似的答案。问题归结到你能容忍多大程度的不准确,以及你试图解决的真正问题是什么。将浮点数转换成相应的整数。@Malina你建议如何将1/3转换成整数?这个答案的例子怎么样?你为什么要把小数转换成整数,你想用这些整数做什么?@Teepeemm我怀疑你上面的评论是针对OP的,而不是我。如果是这样,建议转到问题部分,或者在评论前加上@Malina。