質問
私はCで次のような擬似コードを実装しています:
delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay
floatDelayは常に正です。 math.hのラウンド関数を使用する利点はありますか:
#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));
または使用できます:
delay=(int)(64*(floatDelay - intDelay) + 0.5))
解決
浮動小数点数を扱うときは、常に適切な数学ライブラリを使用する必要があります。浮動小数点数は実際の値に非常に近い近似値にすぎない場合があり、それが奇妙さを引き起こす可能性があります。
たとえば、5fは4.9999999に近似する場合があり、intに直接キャストしようとすると、4に切り捨てられます。
理由を詳しく調べるには、ウィキペディアで浮動小数点数を調べる必要があります。しかし、要するに、数値をintのような一連の直線として格納する代わりに、2つの部分に格納されます。 「分数」がありますおよび指数。floatの最終値は、分数*(基数^指数)です。
他のヒント
intへのキャストが、切り捨てられたように動作することを他のプログラマーにすぐには分からないという事実以外には、私が知っている利点はありません...
ラウンド関数では、意図が明確です。
floatDelay が正であると言う限り、どちらでも構いません。
一方が他方よりわずかに高速である可能性がありますが、 round()
がコンパイラ組み込み関数として実装されている可能性が高いことを考えると、ベンチマークなしでどちらを判断するのは困難です。速度の差は圧倒的に重要ではない可能性が高いため、明確な方を使用してください。
&quot; c ++で10進数値を切り捨て&quot;が見つかりました。浮動小数点数の有用な議論を提供しました。
特にGreg Hewgillがこのリンクを提供しました:すべてのコンピューター科学者が知っておくべきことデビッド・ゴールドバーグによる浮動小数点演算
たとえば、5fは4.9999999に近似する場合があります... また、intに直接キャストしようとすると、4に切り捨てられます。
これは本当ですか?
intに切り捨てる前に0.5を追加したことを確認したら、
本当に4.9999が問題です。
つまり: 4.9999 + 0.5 = 5.4999-&gt; 5
/ヨハン