【问题标题】:Count the number of digits of a floating-point number [closed]计算浮点数的位数[关闭]
【发布时间】:2015-07-29 02:46:06
【问题描述】:

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


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

【问题讨论】:

  • 你的意思是像 1.2 有 2,而 1.21 有 3?基本上数字在0开始或达到精度时结束?
  • PI 的长度是多少?
  • 由于代码中的0.1 不是精确的数学数字0.1,您期望它的位数是多少?你的想法有问题的,使问题不清楚。
  • 0.1000000000000003 怎么样?因为如果您尝试将0.1 打印为double,这就是您可能得到的结果。
  • @Malina 1.00001 很少完全可以表示为double。取而代之的是,1,00001 * 100000 = 100001 在典型的 C 中以 1.000010000000000065512040237081237137317657470703125 * 100000 完成,并且乘积四舍五入到最接近的 double:结果是 100001。如果您尝试其他此类乘法,您可能会遇到一个不等于预期结果的结果,原因是 1) FP 数的二进制实现和 2) 乘积的舍入。

标签: c performance math floating-point digits


【解决方案1】:

问:有没有什么有效的方法来获取一个浮点数的位数?
A:我怀疑。

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

由于典型的binary64 实现double
double x = 0.53x 值:.5300000000000000266453525910037569701671600341796875,52 位。
double x = 0.1x 值:.1000000000000000055511151231257827021181583404541015625 55 位。
与数学 0.1 最接近的 double 是 56 位的 .09999999999999999167332731531132594682276248931884765625

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

DBL_MIN:通常是0.000000(~300 zeros) 22250738585072014... (maybe about 700 more digits)

FP 数字的比较不需要确定十进制表示中的数字位数。要比较 FP 数,请使用常用的关系运算符 >, >=, == 等。

这些值是说明性的。 YMMV。

【讨论】:

  • 我的想法的问题是12,5 * 100 = 1250 这也是0,125 * 1000 = 1250 的结果
  • Malina 当然,您可以找到 select 具有简单精确十进制表示的数字,例如 12.5,但不是 0.53 或 0.1。一般来说,你很快就会遇到 FP 号码的问题。正如@ydobonebi 评论的那样,大多数 FP 数字在精确打印时都有许多十进制数字。当然代码可以四舍五入说 5 或 6 位数,但代码开始只有大概的答案。问题归结为您可以容忍多少不准确性以及您要解决的真正问题是什么。
  • 将浮点数转换为对应的整数。
  • @Malina 您如何建议将 1/3 转换为整数?这个答案的例子怎么样?为什么要将小数转换为整数,又要如何处理这些整数?
  • @Teepeemm 我怀疑您的上述评论是针对 OP 而不是我。如果是这样,建议移至问题部分或将@Malina 添加到此处的评论中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多