如何比较C中的值(长整型)?

时间:2018-12-16 14:20:00

标签: c variables

这是我的代码:

#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循环不会中断。 即使条件是假的,它也会消失... 欢迎帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

x = 0.0000042L;之后,x的值取决于C实现所使用的long double格式。可能是4.2000000000000000001936105559186517000025418155928491614758968353271484375•10 -6 。因此,其十进制表示形式中的位数比问题中预期的代码位数多。随着数字重复乘以10,它会变大。

随着ft_ldmod的发展壮大,发展到数以亿计的世界,它变得越来越慢,因为它通过逐个计数找到round的期望值。

此外,即使给ft_ldmod足够的时间,xround最终也会变得很大,以至于在round上加一个无效。也就是说,在round中表示long double的较大值将需要一个指数,以至于在round中用于表示long double的最低位表示值为2。 / p>

从本质上讲,该程序从根本上来说是有缺陷的,因为它是查找x的十进制表示形式的一种方式。此外,语句x *= 10.0L;会产生舍入误差,因为在long double中通常无法精确表示乘以10的精确数学结果,因此将其舍入为最接近的可表示值。 (这类似于十进制乘以11。从1开始,我们得到11、121、1331、14641,依此类推。位数增加。类似地,二进制乘以十增加有效位的数量。)