首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用浮点数计算“.”之后的数字数?

用浮点数计算“.”之后的数字数?
EN

Stack Overflow用户
提问于 2013-07-24 14:55:20
回答 7查看 32.6K关注 0票数 6

这是一个面试问题。如何用浮点数计算.后的数字数?

例如,如果给3.554 output=3

43.000 output=0。我的代码片段在这里

代码语言:javascript
复制
double no =3.44;
int count =0;
while(no!=((int)no))
{
    count++;
    no=no*10;
}
printf("%d",count);

有些数字不能用float类型表示。例如,在73.487类型中没有floatfloat在c中表示的数字是73.486999999999995来近似它。

现在,当它在无限循环中运行时,如何解决它。

注意:在IEEE754规范中,32位浮点数被划分为24+7+1位。这7个位表示尾数。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-07-24 15:22:17

这个问题实际上并不能如所说的那样解决,因为浮点通常用二进制表示,而不是用十进制表示。正如你所说的,许多小数(实际上大部分)都不能用浮点表示。

另一方面,所有可以用二进制浮点表示的数字都是有限位数的小数--但如果你想要3.44的结果2,那就不是特别有用了。

当我运行您的代码片段时,它说3.44在小数点之后有2位数字--因为3.44 * 10.0 * 10.0恰好产生了精确的344.0。对于另外一个数字,比如3.43 (我还没有试过),可能不会出现这种情况。

当我用1.0/3.0尝试它时,它会进入一个无限循环。添加一些printf表明,经过17次迭代后,no完全变成了33333333333333324.0 --但这个数字太大了,不能表示为int (至少在我的系统上是这样),并且将其转换为int具有未定义的行为。

而对于大量的数字,重复乘以10将不可避免地给你一个浮点溢出.有一些方法可以避免这种情况,但它们不能解决其他问题。

如果将值3.44存储在double对象中,则实际存储的值(至少在我的系统中是这样)正是3.439999999999999946709294817992486059665679931640625,它的小数部分有51位小数。假设您确实希望计算3.439999999999999946709294817992486059665679931640625中点之后的十进制数。由于3.443.439999999999999946709294817992486059665679931640625实际上是相同的数字,所以任何C函数都无法区分它们,并知道它们是否应该返回2或51 (如果您的意思是3.43999999999999994670929481799248605966567993164062或.)。

您可能会检测到存储的值与3.44“足够接近”,但这使得它成为一个更复杂的问题--并且它失去了确定3.439999999999999946709294817992486059665679931640625小数部分中小数数的能力。

这个问题只有在以下情况下才有意义:给定的数字存储在某种格式中,可以实际表示十进制分数(例如字符串),或者添加一些复杂的要求来确定给定的二进制近似表示哪个十进制分数。

对于后者,可能有一种合理的方法,即寻找唯一的十进制分数,它在给定的浮点类型中最近的近似是给定的二进制浮点数。

票数 5
EN

Stack Overflow用户

发布于 2013-07-24 15:03:06

我怀疑这是不是你想要的,因为问题是问一些通常用浮点数没有意义的问题,但下面是答案:

代码语言:javascript
复制
int digits_after_decimal_point(double x)
{
    int i;
    for (i=0; x!=rint(x); x+=x, i++);
    return i;
}
票数 6
EN

Stack Overflow用户

发布于 2013-07-24 20:29:42

这个问题可以这样解释:

给定一个浮点数,找到最短的十进制表示,它将被重新解释为具有正确四舍五入的相同浮点值。

一旦制定成这样,答案是是的,我们可以-看到这个算法:

快速准确地打印浮点数。作者声明: Robert G. Burger and R. Kent Dybvig。ACM SIGPLAN 1996编程语言设计和实施会议,1996年6月

http://www.cs.indiana.edu/~dyb/pubs/FP-Printing-PLDI96.pdf

还请参阅来自计算双值最近的首选十进制结果的参考以获得Smalltalk实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17837654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档