为什么C语言中同时存在%和fmod()函数?

7

我今天在我的计算机科学课上参加了一次测验,因为我不知道C语言中有%操作符的存在,所以错了一个关于取模运算符的问题,我一直在使用fmod()。为什么两者都存在?它们哪个更好/更快,还是它们只处理不同的数据类型?


3
在C语言中,操作符%只能用于整数。 - Vlad from Moscow
5
用于计算模数的“%”运算符和“fmod()”函数之间的区别:这两个操作符都可以用于计算余数,但处理负数时它们会有所不同。使用“%”运算符,结果的符号与被除数相同,而使用“fmod()”函数,结果的符号与除数相同。 - MK.
1
可能是%与FMOD计算取模的重复问题 - Dellowar
4个回答

8
在C语言中,使用%运算符进行模除仅适用于整数操作数,并返回除法的整数余数。函数fmod接受double作为参数,这意味着它接受非整数值并返回除法的余数。
关于fmod的补充说明:在处理double类型操作数时,如何计算余数?感谢@chux提供了有关fmod如何计算浮点除法余数的文档
引用如下:

此函数计算的除法操作x/y的浮点余数恰好是值x-n*y,其中n是x/y,其小数部分被截断。

返回值与x具有相同的符号,并且在大小上小于或等于y。

另一方面,当设计模除二进制运算符(%)时,语言设计人员确定它只支持“整数”类型的操作数,因为从技术上讲,在数学中,“余数”的概念仅适用于整数除法。

@chux,感谢您指出。我已经编辑了我的答案来修复那个额外的注释。 - VHS
1
新的解释也有漏洞。建议使用“fmod函数返回值为x − ny,其中n是某个整数,如果y不为零,则结果与x具有相同的符号且其大小小于y的大小...”C11 §7.12.10.1 3。 - chux - Reinstate Monica
感谢 @chux 展示了 fmod 如何计算浮点数除法的余数文档。我已经再次更新了我的答案,修订了“附加说明”。 - VHS
嗯,有趣。你的链接说“在大小上小于等于y”,而C规范则说“小于y的大小”。看起来“等于”部分是有问题的,因为可能会返回零而不是与y相等的值。 - chux - Reinstate Monica
@chux,我同意你上面的评论。在数学中,余数总是小于除数的。它不能等于除数。 - VHS

5

这是因为 % 是整数运算符,而 fmod 代表 floatmod,用于浮点数。


3
因为它们可能会计算出不同的结果,即使具有相同的值。这些差异可能会出现在负值中。从本质上讲,fmod()和%确实是不同的数学函数。 自C89以来,fmod(x,y)的结果是“结果与x具有相同的符号,并且其大小小于y的大小”。 i % j没有如此单一的定义。请参见模运算的余数计算。这可以有效地允许代码使用现有的变体处理器。div()函数是为了解决这种可变性而创建的。通过C99,它们计算相同的值。未来的C可以允许123.4 % 56.7

2

1
ab为负数时,a%b可能与整数模预期不同。“mod”和“remainder”的区别是什么? double fmod(double)也是如此。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接