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
,您可能会得到这样的结果@Malina1.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。