问题描述
这是一次采访中的问题。
你怎么计算数字的号码后。
在浮点数。
This is one interview question.How do you compute the number of digit after .
in floating point number.
例如。如果给出3.554输出= 3
e.g. if given 3.554 output=3
为43.000输出= 0。
我的code段是这里
for 43.000 output=0.My code snippet is here
double no =3.44;
int count =0;
while(no!=((int)no))
{
count++;
no=no*10;
}
printf("%d",count);
有一些数字,不能用浮法指示
键入。例如,没有 73.487
在浮动
型,由显示浮动在c是
73.486999999999995
近似它。
There are some numbers that can not be indicated by
float
type. for example, there is no 73.487
in float
type, the number indicated by float
in c is 73.486999999999995
to approximate it.
现在如何解决它,因为它在某些无限循环下去。
Now how to solve it as it is going in some infinite loop.
注意:在IEEE 754规格,32位浮点被划分为24 + 7 + 1比特。这7位表示尾数。
Note : In the IEEE 754 Specifications, a 32 bit float is divided as 24+7+1 bits. The 7 bits indicate the mantissa.
推荐答案
问题是不是真正的陈述可解的,因为浮点通常是重新二进制psented,不是小数$ P $。正如你所说,许多(实际上大多数)十进制数字不完全重新presentable浮点。
The problem isn't really solvable as stated, since floating-point is typically represented in binary, not in decimal. As you say, many (in fact most) decimal numbers are not exactly representable in floating-point.
在另一方面,的所有的数字,都正好在二进制浮点重新presentable是具有有限位数小数 - 但如果你想要的结果,这不是特别有用的2
3.44
。
On the other hand, all numbers that are exactly representable in binary floating-point are decimals with a finite number of digits -- but that's not particularly useful if you want a result of 2 for
3.44
.
当我运行code片段,它说,
3.44
的小数点后2位数字 - 因为 3.44 * 10.0 * 10.0
恰好正是产生 344.0
。这可能不会发生另一个号码一样,比方说, 3.43
(我还没有尝试过)。
When I run your code snippet, it says that
3.44
has 2 digits after the decimal point -- because 3.44 * 10.0 * 10.0
just happens to yield exactly 344.0
. That might not happen for another number like, say, 3.43
(I haven't tried it).
当我尝试将其与
1.0 / 3.0
,它进入一个无限循环。加入一些的printf
取值显示,没有
变得正是 33333333333333324.0
之后17迭代 - 但这一数字太大重新psented为 INT
(至少在我的系统),并将其转换为 INT
是未定义行为。
When I try it with
1.0/3.0
, it goes into an infinite loop. Adding some printf
s shows that no
becomes exactly 33333333333333324.0
after 17 iterations -- but that number is too big to be represented as an int
(at least on my system), and converting it to int
has undefined behavior.
和为大量的,由10乘反复将不可避免地给你一个浮点溢出。有办法避免这种情况,但它们都没有解决的其他问题。
And for large numbers, repeatedly multiplying by 10 will inevitably give you a floating-point overflow. There are ways to avoid that, but they don't solve the other problems.
如果您存储在
双击
对象的值 3.44
,实际值存储(至少在我的系统)正是 3.439999999999999946709294817992486059665679931640625
,它在其小数部分的51十进制数字。假设你真的希望的计算在后点的小数位数3.439999999999999946709294817992486059665679931640625
。由于 3.44
和 3.439999999999999946709294817992486059665679931640625
有效的相同数量的的,有没有办法,任何C函数它们之间的区别,并知道它是否应该返回2或51(或50,如果你的意思是 3.43999999999999994670929481799248605966567993164062
,或......)。
If you store the value
3.44
in a double
object, the actual value stored (at least on my system) is exactly 3.439999999999999946709294817992486059665679931640625
, which has 51 decimal digits in its fractional part. Suppose you really want to compute the number of decimal digits after the point in 3.439999999999999946709294817992486059665679931640625
. Since 3.44
and 3.439999999999999946709294817992486059665679931640625
are effectively the same number, there's no way for any C function to distinguish between them and know whether it should return 2 or 51 (or 50 if you meant 3.43999999999999994670929481799248605966567993164062
, or ...).
您也许可以检测到存储的值是足够接近为
3.44
,但是,它使一个更复杂的问题 - 它失去了判断的能力十进制数字中的小数部分 3.439999999999999946709294817992486059665679931640625
数。
You could probably detect that the stored value is "close enough" to
3.44
, but that makes it a much more complex problem -- and it loses the ability to determine the number of decimal digits in the fractional part of 3.439999999999999946709294817992486059665679931640625
.
问题才有意义,如果你给存储在某种格式,实际上可以重新present小数(如字符串),或数字,如果你添加一些复杂的需求确定哪些小数一给出二元近似是为了重新present。
The question is meaningful only if the number you're given is stored in some format that can actually represent decimal fractions (such as a string), or if you add some complex requirement for determining which decimal fraction a given binary approximation is meant to represent.
有可能是通过寻找独特的小数,其最近的近似给定浮点类型是给定的二进制浮点数字做后者以合理的方式。
There's probably a reasonable way to do the latter by looking for the unique decimal fraction whose nearest approximation in the given floating-point type is the given binary floating-point number.
这篇关于计数位数浮点数后`.`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!