如何在C语言中使用%操作符处理浮点数值

16

当我使用%运算符处理浮点数时,会出现错误,提示“invalid operands to binary % (have 'float' and 'double')”。我只想输入整数值,但这些数字非常大(超出int类型的范围),因此我使用浮点数来避免不便。有没有办法在这样的大整数值上使用%运算符?


1
是的,模数除法a = b%c;不起作用,因为你不能通过将小数除以小数来得到余数。 - user7263693
6个回答

26
你可以使用标准数学库中的 fmod 函数。它在标准头文件 <math.h> 中有原型定义。

5
+1... 但附上fmod的链接会更好 :) - pmg
4
@pmg:这不是为什么我们被允许编辑他人的帖子吗? :) (翻译:难道这不就是为什么我们可以编辑别人的帖子的原因吗?:)) - Sedat Kapanoglu

7

% 运算符仅对整数类型的操作数有定义;对于浮点数类型,您需要使用 fmod* 库函数:

#include <math.h>
double fmod(double x, double y);
float fmodf(float x, float y);
long double fmodl(long double x, long double y);  

6

你最好使用 long long,它在大多数系统中比double具有更高的精度。

注意:如果你的数字超过了long long的容量限制,那么fmod可能不会按照你想要的方式运作。在这种情况下,最好使用一个 bigint 库,例如这个


BigIntegerLibrary在c中无法被接受??此外,大整数的%指示符是什么??? - Shiv Shakti
抱歉,我建议的库是C++。 - Marcelo Cantos

1

当我没有易于访问的fmod或其他库(例如,快速制作Arduino草图)时,我发现以下方法足够好:

float someValue = 0.0;

// later...

// Since someValue = (someValue + 1) % 256 won't work for floats...
someValue += 1.0; // (or whatever increment you want to use)
while (someValue >= 256.0){
    someValue -= 256.0;
}

0
如果你想使用 int,请使用 long long,如果存在更好的格式,请不要使用非理想的格式来解决问题。

0

考虑:32位int和64位long long int

是的,%(取模)操作符不能用于浮点数和双精度数..如果你想对大数进行取模运算,你可以检查long long int(64位),这可能会帮助你。

如果仍然超过64位,则需要将数据存储在..字符串中,并通过算法进行模运算。

或者您可以转到任何类似Python的脚本语言。


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