这是我的代码:
#include <stdio.h>
static long double ft_ldmod(long double x, long double mod)
{
long double res;
long double round;
res = x / mod;
round = 0.0L;
while (res >= 1.0L || res <= -1.0L)
{
round += (res < 0.0L) ? -1.0L : 1.0L;
res += (res < 0.0L) ? 1.0L : -1.0L;
}
return ((x / mod - round) * mod);
}
int main(void)
{
long double x;
long double r;
x = 0.0000042L;
r = ft_ldmod(x, 1.0L);
while (r != 0.0L) // <-- I have an infinite loop here
{
x *= 10.0L;
r = ft_ldmod(x, 1.0L);
}
printf("%Lf", x);
return (0);
}
似乎有些错误,但无法解决。
主函数中的while
循环不会中断。
即使条件是假的,它也会消失...
欢迎帮助,谢谢。
答案 0 :(得分:0)
在x = 0.0000042L;
之后,x
的值取决于C实现所使用的long double
格式。可能是4.2000000000000000001936105559186517000025418155928491614758968353271484375•10 -6 。因此,其十进制表示形式中的位数比问题中预期的代码位数多。随着数字重复乘以10,它会变大。
随着ft_ldmod
的发展壮大,发展到数以亿计的世界,它变得越来越慢,因为它通过逐个计数找到round
的期望值。
此外,即使给ft_ldmod
足够的时间,x
和round
最终也会变得很大,以至于在round
上加一个无效。也就是说,在round
中表示long double
的较大值将需要一个指数,以至于在round
中用于表示long double
的最低位表示值为2。 / p>
从本质上讲,该程序从根本上来说是有缺陷的,因为它是查找x
的十进制表示形式的一种方式。此外,语句x *= 10.0L;
会产生舍入误差,因为在long double
中通常无法精确表示乘以10的精确数学结果,因此将其舍入为最接近的可表示值。 (这类似于十进制乘以11。从1开始,我们得到11、121、1331、14641,依此类推。位数增加。类似地,二进制乘以十增加有效位的数量。)