タグ付けされた質問 「rounding」

数値を丸めるとは、ほぼ等しいが、より短く、より単純で、より明示的な表現を持つ別の値に置き換えることです。

5
多くの(古い)プログラムがround(input)ではなくfloor(0.5 + input)を使用するのはなぜですか?
違いは、次のコードのように、タイブレークに関する入力を与える戻り値にあります。 int main() { std::cout.precision(100); double input = std::nextafter(0.05, 0.0) / 0.1; double x1 = floor(0.5 + input); double x2 = round(input); std::cout << x1 << std::endl; std::cout << x2 << std::endl; } 出力: 1 0 しかし、最終的には結果が異なるだけで、好みの結果を選択します。のfloor(0.5 + input)代わりにを使用している「古い」C / C ++プログラムがたくさんありますround(input)。 歴史的な理由はありますか?CPUで一番安い?
80 c++  rounding  floor 

2
差がマシンの精度よりも小さいかどうかを確認する正しい/標準的な方法は何ですか?
私はしばしば、得られた差が機械の精度を超えているかどうかを確認する必要がある状況に陥ります。この目的のために、Rには便利な変数があります.Machine$double.eps。ただし、この値の使用に関するガイドラインについてRソースコードを参照すると、複数の異なるパターンが表示されます。 例 statsライブラリの例をいくつか示します。 t.test.R if(stderr < 10 *.Machine$double.eps * abs(mx)) chisq.test.R if(abs(sum(p)-1) > sqrt(.Machine$double.eps)) 統合します。 rel.tol < max(50*.Machine$double.eps, 0.5e-28) lm.influence.R e[abs(e) < 100 * .Machine$double.eps * median(abs(e))] <- 0 princomp.R if (any(ev[neg] < - 9 * .Machine$double.eps * ev[1L])) 等 ご質問 どのようにして、これらの異なるすべての背後にある理由を理解することができ10 *、100 *、50 *およびsqrt()修飾子を? .Machine$double.eps精度の問題による差異の調整に使用するガイドラインはありますか?

3
Python 3.xの切り上げ
Pythonでの丸めに関する質問はすでに何度も尋ねられていることは知っていますが、答えは私を助けませんでした。浮動小数点数を半分に丸めて浮動小数点数を返すメソッドを探しています。このメソッドは、小数点以下の桁数を定義するパラメーターも受け入れる必要があります。このような丸めを実装するメソッドを作成しました。ただ、見た目は上品ではないようです。 def round_half_up(number, dec_places): s = str(number) d = decimal.Decimal(s).quantize( decimal.Decimal(10) ** -dec_places, rounding=decimal.ROUND_HALF_UP) return float(d) フロートを文字列に変換して(浮動小数点の不正確さを回避するため)、decimalモジュールを操作する必要があるのが気に入らない。より良い解決策はありますか? 編集:以下の回答で指摘されているように、正しい丸めはそもそも数値の正しい表現を必要とするため、私の問題の解決策はそれほど明白ではありませんが、これは浮動小数点の場合とは異なります。だから私は次のコードが def round_half_up(number, dec_places): d = decimal.Decimal(number).quantize( decimal.Decimal(10) ** -dec_places, rounding=decimal.ROUND_HALF_UP) return float(d) (上記のちょうどフロート番号を直接進数にしていない文字列に変換されるという事実により、コードから異なりが最初という)は、このように使用する場合2.18を返すために:round_half_up(2.175, 2)しかし、それはしませんので、Decimal(2.175)戻りますDecimal('2.17499999999999982236431605997495353221893310546875')フロート、道を番号はコンピュータによって表されます。驚いたことに、浮動小数点数が最初に文字列に変換されるため、最初のコードは2.18を返します。str()関数は、最初に丸めることを意図していた数に暗黙の丸めを行っているようです。したがって、2つの丸めが行われています。これは私が期待する結果ですが、技術的に間違っています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.