問題タブ [double-precision]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
588 参照

c++ - C++ : sin(M_PI/6) = 0.5?

私は、メインのアルゴリズム、つまりsin(M_PI/N)forでサインの一般的な値を使用する科学プログラムを書いていN = 1, 2, 3, 4, 5, 6ます。

プログラムをできるだけ高速にしたいので、これらの値を何度も計算するのではなく、ベクトルに格納しようと考えました。次のようになります。

だから今、私のメインアルゴリズムでは、s = sin_pi_over_n_[n-1];の代わりに書いていs = sin(M_PI/n);ます。

しかし、驚いたことに、プログラムはほぼ 2 倍遅くなりました。ベクトルの値を読み取るのにそんなに時間がかかるのだろうか?しかし、それは問題ではないことに気付きました。

その後、プログラムは再び高速になります。それから私は考えました:サインの値に何か問題があります。しかし、クレイジーなことは、最後の行sin_pi_over_n_.push_back(sin(M_PI/6.0));を置き換えるだけでもsin_pi_over_n_.push_back(0.5);、プログラムが再び遅くなることです! 倍精度についてですか?std::cout << abs(sin(M_PI/6.0) - 0.5) << std::endl;私はそれをちょっと疑っています0.

おっと:今気づきました。std::cout << sin(M_PI/6.0) - 0.5 << std::endl;( なしでabs)尋ねると、 が得られ-5.55112e-17ます。この振る舞いは私には信じられないように思えるので、私はまだ先に進んでその質問を投稿するつもりです. このような予測不可能な現象がパフォーマンスに大きな影響を与える場合、プログラムの速度を最適化するにはどうすればよいでしょうか?

あなたの洞察に感謝します!

編集:多分私は自分自身を十分に明確にしていません。私のプログラムには、 class がありAlgoます。プログラムを実行すると、ある関数、たとえばmy_functionが膨大な回数呼び出されます。この関数の 1 行は次のとおりs = sin(M_PI/n);です。この行を に置き換えると思いましたs = sin_pi_over_n_[n-1];。ここで、sin_pi_over_n_[n-1]はクラスのメンバー変数として格納されているベクトルでありAlgo、のコンストラクターに一度だけ入力しAlgoます。物事がより明確になることを願っています。

編集 2 : わかりました。さらにコードを投稿してほしいという方もいるようです。ここに来ます:

クラスAlgo:

メンバー関数create_sines:

メンバー関数super_radius_update(my_function上記で名前を変更しました):

クラス全体が少し長くて複雑なので、実行できる最小限の完全な例を送るのは難しいと思います。試すことはできますが、大量のコードを投稿する必要があり、抽出するのにかなりの時間がかかります...

Linux Ubuntu 12.04 64 ビット ラップトップで Qt クリエーター 4.8 64 ビットを使用しています。

編集 3 または 4 : すべての編集についてお詫び申し上げます。お伝えしなかった重要な情報がありますsuper_radius_update。エラーが許容範囲内に収まるまで、プログラムは実行されます (基本的に関数を呼び出します)。結果として、プログラムが遅くなったり速くなったりするのは、 の実行時間ではなく、super_radius_updateその関数の呼び出し回数だと思います。そのような値を使用sin(M_PI/N)すると、エラーが許容範囲に到達する速度に影響を与えます。

0 投票する
1 に答える
2421 参照

android - SimpleCursorAdapter で double をフォーマットすることは可能ですか?

次の SimpleCursorAdapter を使用します。

そして、これはうまくいきます。ただし、「campos[]」の「preco」は double の値に由来します。これを何らかの形でフォーマットして、カーソル (リストビューをフィードする) がポイントの後に 2 桁でこの double を表示するようにすることはできますか (お金の値のように)?

どこかで「%.2f」を使用するなど、簡単な方法でそれを行うことはできますか?それとも、CursorAdapter をサブクラス化する必要がありますか?

前もって感謝します。

0 投票する
1 に答える
4826 参照

floating-point - 倍精度浮動小数点数はどのように単精度浮動小数点形式に変換されますか?

数値を倍精度浮動小数点形式から単精度浮動小数点形式に変換すると、精度が失われます。この変換を達成するために使用されるアルゴリズムは何ですか?

数値は、それぞれの制限に単純に削減されるよりも大きい3.4028234e+38か小さいか? -3.4028234e+38変換プロセスはこれよりも少し複雑だと思いますが、ドキュメントが見つかりませんでした。

0 投票する
1 に答える
982 参照

java - べき乗するには大きすぎる値でマルコフ連鎖確率を計算する

マルコフ連鎖のレートとして式exp(X)を使用します。したがって、あるリンクを別のリンクよりも選択する比率は、exp(X1)/ exp(X2)です。私の問題は、Xが非常に大きい場合があるため、exp(X)がの範囲を超えることですdouble

または、X [i]の配列があり、一部のX [i]が非常に大きいため、exp(X [i])がの範囲をオーバーフローするdouble場合、各iについてexp(X [i])/ Sを計算します。ここで、Sすべてのexp(X [i])の合計です。

0 投票する
2 に答える
2294 参照

java - Javaでexpの代わりにexpm1を使用する場合

javaでexpm1関数を使用することについて混乱しています。Math.expm1のOraclejavadocには次のように書かれています。

exp(x)-1を返します。xの値が0に近い場合、expm1(x)+ 1の正確な合計は、exp(x)よりもexの実際の結果にはるかに近いことに注意してください。

しかし、このページには次のように書かれています。

ただし、xの負の値(約-4以下)の場合、Math.exp()の計算に使用されるアルゴリズムは比較的動作が悪く、丸め誤差が発生します。別のアルゴリズムでex-1を計算してから、最終結果に1を加算する方が正確です。

負のx値または0に近い値には、expm1(x)を使用する必要がありますか?

0 投票する
3 に答える
2350 参照

c - Cのdoubleデータ型の最大精度は?

C で 2 つの double 型の変数を比較するために、 を定義し#define EQUALITY_EPSILON = 1e-8ました。私は次のように比較を行っています:

私が直面している問題は、コード内のスコアが非常に小さいためEQUALITY_EPSILON = 1e-8、 の場合、比較の結果が等しい場合があることです。私の質問は、どのくらい小さく設定できEQUALITY_EPSILONますか?

0 投票する
2 に答える
1931 参照

c# - 二重文字列が往復安全かどうかを知る方法は?

double のテキスト表現があり、それを double に往復させても安全かどうかを知りたいです。入力の任意の種類の数値スタイルも受け入れたい場合、どうすればこれを知ることができますか? または、Double.Parse で double-string を解析したときに精度が失われるかどうかをどのように知ることができますか? または、ダブル文字列を別のダブル文字列と同じ形式に一致させるにはどうすればよいですか? これらの質問に対する答えは、私が思う解決策になるでしょう。

0 投票する
3 に答える
233 参照

c# - どちらの方法がより正確ですか?

数値範囲を同じ長さのセグメントに分割する必要があります。しかし、どちらの方法がより正確かは判断できません。例えば:

(double)int1 / int2 * doubleまたはについてint1 * double / int2です。どちらの方法がより正確ですか? どの方法を使用すればよいですか?

アップデート

次のコードは違いを示します。

0 投票する
2 に答える
790 参照

math - cuda倍精度対数誤差

私は 3.0 コンピューティング機能で CUDA に C を使用しており、倍精度の組み込み対数関数を使用する必要があります。そのためにはdouble log(double x)関数(documentation)を使用する必要があることがわかりました。しかし、倍精度スコープ内で非常に小さな数値を渡すと (例: double x = 6.73E-42)、 log(x)関数は を返します-Infinity。同じ値のJavaMath.log()関数では、 が返されます-94.802。これは CUDA 数学ライブラリ内のバグですか、それとも何か問題がありますか?

編集:カーネル関数で使用しているコードは次のとおりです

0 投票する
1 に答える
1414 参照

ios - 座標の小数点以下第2位

文字列をdouble値に変換して、注釈の座標として使用しようとしています。

マップ上に小数点以下5桁を配置するには、double値が必要です。

hello文字列がで、必要なdoubleがであるとしましょうwhatsup

文字列の形式は私が望むとおりであり、それをdoubleにしたいので、文字列のdoublevalueプロパティを使用します。

だから今私が書きたいのなら:

それは余分なゼロでダブルを与えます。

どうすれば書くことができますか

小数点以下5桁のdoubleはどれですか?
どういうわけかここに「%.5f」を実装できますか?

numberformatterを試しましたが、NSnumberが表示されます。ダブルが必要です:

このコードをforループで使用して、注釈(ピン)をプロットしています。

同じforloopをdoubleで使用すると、ハードコードで正常に動作します。しかし、このコードを使用してcsvファイルから値を取得すると、ピンが取得されません。