gpt4 book ai didi

c - 在 C 中使用 float 计算模数时出现问题

转载 作者:行者123 更新时间:2023-12-04 10:21:17 24 4
gpt4 key购买 nike

我不是编程专家,我面临以下问题。

我需要计算浮点数 A 和 B 之间的模数。
所以我使用 fmod((double)A, (double)B)。
理论上,如果 A 是 B 的倍数,则结果为 0.0。
但是,由于浮点精度目的,A 和 B 并不完全是我期望的数字。
然后,模计算的结果不是 0.0,而是不同的东西。
这是有问题的。

例子:
A=99999.9,但编译器将其解释为 99999.898。
B=99.9,但编译器将其解释为 99.900002。
fmod(A,B) 预计为 0.0,但实际为 99.9。

所以问题是:您如何使用来管理这种情况?

谢谢

最佳答案

麻烦在于:A不是 99999.9 , 但 99999.8984375 和B不是 99.9 ,但 99.90000152587890625 和A mod B 99.89691162109375

OP 正在为给出的参数得到正确的答案。

需要使用不同的增强。

一个合理的替代方法是将参数按缩放的 10 次幂转换,然后四舍五入为整数,% ,回到浮点和非缩放。

溢出是一个问题。

由于 OP 想要将数字处理为最接近的 0.1,因此缩放比例为 10。

#include <float.h>
#include <stdio.h>

int main(void) {
float A = 99999.9;
float B = 99.9;
printf("%.25f\n", A);
printf("%.25f\n", B);
printf("%.25f\n", fmod(A,B));
long long a = lround(A*10.0);
long long b = lround(B*10.0);
long long m = a%b;
double D = m/10.0;
printf("D = %.25f\n", D);
return 0;
}

输出
99999.8984375000000000000000000
99.9000015258789062500000000
99.8969116210937500000000000
D = 0.0000000000000000000000000

替代
  long long a = lround(A*10.0);
long long b = lround(B*10.0);
long long m = a%b;
double D = m/10.0;

缩放,但跳过整数转换部分
  double a = round(A*10.0);
double b = round(B*10.0);
double m = fmod(a,b);
double D = m/10.0;

关于c - 在 C 中使用 float 计算模数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60837713/

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