如何在C中求双精度数的余数?模运算只对整数有效

bq3bfh9z  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(234)

这是我目前在网上找到的

int main(void)
{
    long a = 12345;
    int b = 10;

    int remain = a - (a / b) * b;
    printf("%i\n", remain);
}

首先,我想知道这个公式是如何工作的。也许我不会数学,但是这里的运算优先级似乎有点奇怪。如果我运行这段代码,预期的答案5会被打印出来。但是我不明白(a / b)* b为什么不抵消'a',导致a-a = 0。
这只对整型和长整型有效,一旦涉及到双精度型,它就不再有效了,有人可能会告诉我为什么,有没有一种替代模运算的方法可以对双精度型有效?
此外,我不知道如果我了解到什么值一个长可以去,我发现网上的上限是2147483647,但当我输入更大的数字,如一个在'a'的代码运行没有任何问题,直到一定的点...
谢谢你的帮助,我是新的编码和尝试学习!

p5cysglq

p5cysglq1#

给定两个double有限数xy,其中y不等于零,fmod(x, y)得到x除以y的余数,具体地说,它返回xny。其中,n 的选择使得xnyx具有相同的符号,并且在量值上小于y。(因此,如果x为正,则0 ≤ fmod(x, y)x;如果x为负,则xfmod(x, y) ≤ 0。)
<math.h>中声明了fmod
正确实现的fmod返回精确的结果;因为指定的结果总是可表示的,所以不存在浮点错误。
C标准还指定remquo返回商 nremainder的余数和一些低位(至少三位),并对余数的定义进行了修改。它还指定了这些函数的floatlong double的变体。

rekjcdws

rekjcdws2#

简单的实现。有限的范围。添加额外的浮点不精确(因为它执行一些算术运算)

double naivemod(double x)
{
    return x - (long long)x;
}

int main(void)
{
    printf("%.50f\n", naivemod(345345.567567756));
    printf("%.50f\n", naivemod(.0));
    printf("%.50f\n", naivemod(10.5));
    printf("%.50f\n", naivemod(-10.0/3));
    
}

相关问题