gpt4 book ai didi

c - 如何在 C 中比较(long double)值?

转载 作者:行者123 更新时间:2023-11-30 19:28:32 25 4
gpt4 key购买 nike

这是我的代码:

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

最佳答案

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

随着它变得越来越大,达到数百万和数十亿,ft_ldmod变得越来越慢,因为它找到了所需的值 round按个数计算。

此外,即使ft_ldmod给予足够的时间,xround最终会变得如此之大,以至于在 round 上加一。没有影响。即代表round的大值在long double将需要一个如此大的指数,以至于最低位用于表示 roundlong double代表值 2。

本质上,该程序在查找 x 的十进制表示形式方面存在根本缺陷。 。此外,声明x *= 10.0L;会产生舍入误差,因为将数字乘以 10 的精确数学结果通常无法在 long double 中准确表示。 ,因此它被四舍五入到最接近的可表示值。 (这类似于乘以十进制的 11。从 1 开始,我们得到 11、121、1331、14641 等。位数不断增加。同样,乘以二进制的 10 也会增加有效位数。)

关于c - 如何在 C 中比较(long double)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53803026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com