为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]

Posted

技术标签:

【中文标题】为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]【英文标题】:why % operator can not be used for float in C/C++ but can be used in Java and C#? [duplicate]为什么 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制] 【发布时间】:2014-12-28 07:54:26 【问题描述】:

考虑下面的 C++ 程序:

#include <iostream>
int main()

    float f = 9.9f, m = 3.3f;
    float c = f % m;  
    std::cout << c;
    return 0;

显示错误:Illegal use of floating point

当我用 Java 编写相同的程序时:

class Test

    public static void main(String args[])
    
        float f = 9.9f, m = 3.3f;
        float c = f % m;
        System.out.println(c);
    

给我输出:3.2999997

在 C# 中也是如此:

using System;
class Test

    public static void Main()
    
        float f = 9.9f, m = 3.3f;
        float c = f % m;
        Console.WriteLine(c);
    

给出输出:3.3

为什么相同的编程逻辑会以不同的语言提供三种不同的输出?为什么我们不能在 C/C++ 中将 modulo % 与浮点数一起使用,但可以在 Java 和 C# 中使用?

对不起,如果这是一个愚蠢的问题...我是学生...谢谢。

【问题讨论】:

因为% 的数学用法仅适用于整数。请改用fmod @MarounMaroun 但为什么它适用于 java 和 C# 中的浮点数? @MarounMaroun 不,不是重复的吗?你能解释一下它在 Java 和 C# 中的行为吗? 因为c/c++不是java也不是c#,所以它们在语法上相似,但也不同。 打开重复阅读接受的答案。您将得到答案,为什么它在 c++ 中是这样的,为什么在 c# 中,java 是这样的。因为他们做了这个功能。 【参考方案1】:

可能 C 和 C++ 没有它,因为有不止一种方法可以做到这一点:向零舍入 (fmod) 和向最接近的整数舍入 (remainder)。您必须知道(或查找)您引用的其他语言选择了哪些版本。

【讨论】:

但整数值也是如此。 @RudyVelthuis,不,我不这么认为。在我所知道的所有数学上下文中,整数除法是唯一定义的,从不等于舍入。 没有四舍五入,但模数可以朝向 0 或朝向负无穷大。所以,是的,整数也是如此。看看this page右边的表格就知道了。它要么是除数的符号,要么是被除数,总是正数,要么是实现定义,这取决于语言(即使在早期的 C 语言中,它也是实现定义的)。 特别是:> 定义【参考方案2】:

我从here 找到了最简单的解决方案。

模运算符(余数运算符)返回除法的一部分 在非浮点运算的情况下丢弃(余数)。

所以当你有浮点模数时没有意义,因为 没有任何东西被丢弃。

e.g.

int:
155 % 100 = 55

so, for integer division, 155 / 100 = 1 reminder = 55

and for floating point division: 155 / 100 = 1.55 remainder=0.0

所以,由于浮点除法时没有提醒,% 运算符不适用于浮点运算。

因此,在 C 等早期语言中,不支持 % 浮点运算符。

在 java 和 C# 中,余数的概念得到了扩展,在使用 % 运算符时,浮点数被视为一个数字,价格最多为 x 个小数点。

例如,Java 将采用 9.900000 % 3.300000 = 3.2999997,而 C# 将采用 9.9 % 3.3 = 3.3。因此,在使用% 时,这里的 9.900000 和所有浮点数都变成了价格编号。所以他们可以给余数。实际上,它们是 9.9xxxxxxxxxxxxxxxxxxxxx...(不精确)。

【讨论】:

请注意,它在 C++ 中称为 余数运算符。不是 模运算符 @juanchopanza 我说的是普通数学……不是 C++。 关于“小数点”的最后一部分不太清楚。要点:浮点数是精确的,但二进制精确到x 位。舍入到 y 十进制数字不精确。 @MSalters 我无法理解...如果您知道,请编辑...我会批准的

以上是关于为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Lua和C++中的浮点数的比较

工具类---提供精确的浮点数运算

当我使用较小的浮点数时,为啥 sklearn 中的 KNN 实现会变慢?

计算机中的浮点数(IEEE754)

Printf 用于 c 中的浮点数

4-浮点数运算