2017-05-01 13 views
-1

Iは以下の通りである計算を持っている:使用小数部分

1472/48 = 30.666667 
(30 * 48) = 1440 
(0.666667 * 48) = 32 

だからnead番号は実部および小数部を用いて計算することができる1440および32であります最初の計算。 次のコードを使用して、私は実数部を見つけますが、小数部はスケール上にあります。

#define SHIFT_AMOUNT 16 
// 2 bytes is used to map divisions 
#define SCALE_FACTOR 65535 // (2^16) 
#define SHIFT_MASK  ((1 << SHIFT_AMOUNT) - 1) 

uint32_t total_msgs = DATA_LENGTH << SHIFT_AMOUNT; 
total_msgs /= PAYLOAD_SIZE; 

uint8_t real_part = total_msgs >> SHIFT_AMOUNT; // 30 
uint32_t decimal_part = total_msgs & SHIFT_MASK; // 43690 

ここで最後に計算されています。どのように私は((65535分の43690)= 0.666667)本当にある(43690から32を得るのですかこの問題を解決するための

+0

これは問題ありませんが、2^16 = 65536ではなく65535 – harold

+0

です。整数の実数部は実数部です。 「実数部」という用語は、複素数に対してのみ意味を持ちます。また、整数分数には小数部はありません。 – Olaf

+1

また、実際に何を計算したいのかを明確にする必要があります。異なるものを想定した異なる答えがあります。 – harold

答えて

2

通常の方法は%演算子です:?他の人がいるので、述べたように

quotient = DATA_LENGTH/PAYLOAD_SIZE; 
fraction = DATA_LENGTH % PAYLOAD_SIZE; 
+0

いくつかの最適化コンパイラでは、これによって真の分割が生じることがあります。 – Olaf

+0

私はこれが可能だとは思わなかった。ありがとう、それを修正した! – boortmans

+0

@olaf:それは本当です。一方、 'PAYLOAD_SIZE'が定数である場合、良いコンパイラは除算を使用しないことがあります。重要なコードを手動で挿入することもできます。 – rici

1

あなたが必要とする値は、商と除算の剰余の整数部分は、あなたがそれを行うには、それぞれ/%演算子を使用することができます:

int quot = 1472/48; 
int rem = 1472 % 48; 

しかし、むしろ、同じ2つの別々の操作を行っていますあなたは、多くの場合、この特定の計算を実行している場合、いくつかのプロセッサ(特にx86の)が単一であなたの両方の値を与えるように、これはあなたのスピード増加を与えるかもしれない

div_t result = div(1472, 48); 
printf("quotient=%d, remainder=%d\n", result.quot, result.rem); 

:数字のペアは、あなたがdiv機能を使用することができますこれにより、分割操作の数を半分に削減する可能性があります。

+1

コンパイラがとにかく(GCCとClangが)それらの操作をマージすることを望むだろう、 – harold

関連する問題