2011-09-21 3 views
7

float値に%演算子を使用すると、 "無効なオペランドが2進数%(浮動小数点数と '倍精度浮動小数点数')にあります"というエラーが発生します。値だけですが、数値は非常に大きいので(int型の範囲ではありません)、私は浮動小数点数を使用しています。そのような大きな整数値に%演算子を使用する方法はありますか?cの浮動小数点数に%operatorを使用する方法

+0

だから、1.5%1.1 = 0.4? – StuartLC

+0

剰余除算a = b%c; 10進数を10進数で除算して余りを得ることができないため、動作しません。 –

答えて

11

標準数学ライブラリのfmod関数を使用できます。プロトタイプは標準ヘッダ<math.h>にあります。

+2

+1 ...しかし、[fmod](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fmod.html)へのリンクは素晴らしかったでしょう:) – pmg

+1

@pmg:そうではありません他の人の投稿を編集することはできますか? :) –

+0

@ssg:間違いなく! – cyco130

5

多くのシステムでは、精度がdoubleよりも高いlong longを使用する方がよいでしょう。

注:数値がlong longより大きい場合、fmodはおそらくそれが望むように動作しません。その場合、あなたの最善の策は、this oneのようなbigintライブラリです。

+0

BigIntegerLibraryはcで受け入れられていないのですか?また、Big整数の%指定子は何ですか? –

+0

申し訳ありませんが、私が提案したライブラリはC++です。 –

0

を考える:あなたが大規模な数にモジュロ演算を行いたい場合のことができます.32ビットと64ビット

の長い長いint型はい、%(剰余)演算子は山車とダブルで動作していないint型long long int(64bits)を確認してください。

さらに64ビットを超える範囲では、データを.. stringに格納し、アルゴリズムでモジュロ演算を行う必要があります。

かのどちらかあなたがPythonのような任意のスクリプト言語に行くことができます

4

%オペレータのみ整数型のオペランドに定義されています。あなたは浮動小数点型のため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); 
0

あなたはあなたの問題のための非理想的なフォーマットを使用していない、長い長いint型の使用を使用する場合であればより良いフォーマットが存在する。私はfmodまたは他のライブラリへの容易なアクセスを持っていなかった

0

は、(例えば、迅速な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; 
} 
関連する問題