問題タブ [floating-point-conversion]
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.
java-7 - java 7 123.123456f が 123.12346 になるのはなぜですか?
Java 7 64 ビットで LibGDX プログラムに取り組んでいます。
float をパラメーターとして受け取る関数を junit を使用してテストすると、奇妙な結果が得られました。123.123456f
パラメータとして使用して関数を呼び出すと、関数は receive を受け取り123.12346
ます。なぜこれが起こるのですか?
12.123456f
パラメータとして
使用すると、正しい結果が得られました。123.12345f
まだ動作します。
したがって、私System.out.println(...)
は入力をチェックするために使用します。
私にとっては重要ではありませんが、理由を知りたいだけです。どうもありがとうございました!
よろしく、 アントニー
java - Javaを使用してStringを文字ごとにFloat文字に変換する方法は?
以前インタビューで聞かれたのですが、よくわかりませんでした。一度にすべてをキャストすることは許可されていなかったので、次のアイデアは文字列変換をポイントまで実行することでしたが、私にインタビューした人は、次のようなことをしたいと言いました:
入力はconvert "1234.567" to a float ie. 1234.567
正直なところ、彼がどのようにそれを行うつもりだったのかわかりません。また、各文字を解析するために循環するだけだったことを示すのに十分なコードを生成できていません。
c++ - double を固定小数点表記で文字列に変換し、末尾にゼロを付けず、sprintf を使用しない
この質問は数回尋ねられましたが、すべての回答は sprintf を参照しているか、末尾のゼロを手動で削除する必要があります。本当に良い方法はありませんか?でこれを達成することはできませんstd::stringstream
か?
java - float は double に収まるのに、float[] は double[] に収まらないのはなぜですか?
を引数として取る関数がある場合double
、簡単に を入れることができますfloat
。
ただし、 a を取る関数がある場合、 a をdouble[]
渡すことはできませんfloat[]
。
php - PHP: float を 10 進数展開としてフォーマットする
formatFloat()
float を取り、それを 10 進展開文字列としてフォーマットする関数を作成したいと思います。例えば:
初期のアイデア
float を文字列にキャストするだけではうまくいきません。なぜなら、 float が about よりも大きいか、 about1.0E+14
よりも小さい場合1.0E-4
、PHP はそれらを10 進数展開ではなく指数表記でレンダリングするからです。
number_format()
試してみる明らかな PHP 関数です。ただし、この問題は大きな float の場合に発生します。
小さい float の場合、難しいのは、要求する 10 進数の桁数を選択することです。1 つのアイデアは、多数の 10 進数を要求してからrtrim()
、余分な0
s を要求することです。0
ただし、10 進展開がsで終わらないことが多いため、この考えには欠陥があります。
問題は、浮動小数点数の精度が制限されており、通常、リテラルの正確な値を格納できないことです (例: 1.0E+25
)。代わりに、表現できる最も近い値を格納します。 number_format()
これらの「最も近い近似値」を明らかにしています。
Timo Frenay のソリューション
このコメントがページの奥深くに埋もれていることを発見しましたがsprintf()
、驚くべきことに賛成票はありませんでした。
大きさに関係なく、有効桁数が 16 桁の浮動小数点数を出力する方法を次に示します。
重要な部分は、 を使用して float の桁log10()
数を決定し、次に必要な 10 進数の桁数を計算することです。
修正が必要なバグがいくつかあります。
- このコードは、負の浮動小数点では機能しません。
- このコードは、非常に小さな float (例: ) では機能しません
1.0E-100
。PHP は次の通知を報告します: "sprintf()
: 要求された 116 桁の精度は、PHP の最大 53 桁に切り捨てられました" - である場合
$value
はです。0.0
log10($value)
-INF
- PHP floatの精度は「おおよそ 10 進数で 14 桁」なので、16 桁ではなく 14 桁を表示する必要があると思います。
私の最善の試み
これが私が思いついた最善の解決策です。これは Timo Frenay のソリューションに基づいており、バグを修正し、余分なsをトリミングするためにThiefMaster の正規表現を使用しています。0
これは、200 個のランダムなフロートを使用した Ideone のデモです。コードは、約よりも小さいすべてのフロートに対して正しく機能するようです1.0E+15
。
number_format()
非常に小さなフロートでも正しく機能するのは興味深いことです。
質問
私の最善の試みは、formatFloat()
まだこの問題に悩まされています:
この問題を解決するためにコードを改善するエレガントな方法はありますか?
c++ - C++ 入力演算子を使用した float の読み取り
検討
このコードが消費できる入力の文字数は明確に定義されていますか? num
入力ストリームが、型が表現できる精度よりもはるかに高い精度で指定されている可能性がある場合に特に興味がありますfloat
。したがって、この場合、コードがすべて (次の非数値入力まで) を読み取るか、または の最大精度までだけを読み取るかは標準化されていますfloat
。
c++ - 使用可能な固定サイズの浮動小数点型がない場合の浮動小数点値のエンディアンの処理
私はバイナリファイルリーダー/ライターを書いていますが、エンディアンの問題を処理するために、すべてのデータを書き込み時に「ネットワーク」(ビッグ) エンディアンに変換し、読み取り時にホストエンディアンに変換することにしました。hton*
それらの機能だけのためにwinsockとリンクしたくないので避けています。
私の混乱の主なポイントは、浮動小数点値の処理方法にあります。すべての整数値について、<cstdint>
(uint32_t
など) でサイズ指定された型を使用していますが、私の調査では、浮動小数点型に相当するものは存在しません。書き込み時にすべての浮動小数点値を 32 ビット表現に変換し、ホストで使用されている精度に戻します (私のアプリケーションでは 32 ビットで十分です)。このようにして、浮動小数点値に対して読み書きするバイト数を正確に知ることができます。ファイルをロードしているマシンと、ファイルを書き込んだマシンで使用sizeof(float)
して異なっていた場合とは対照的です。sizeof(float)
frexp
を使用して仮数と指数を整数項で取得し、それらの整数を (固定サイズで) 書き出し、次に整数を読み取り、 を使用して浮動小数点値を再構築する可能性を認識しましldexp
た。これは有望に見えますが、/なしで float エンディアンを処理するための一般的に受け入れられている、または推奨されている方法があるかどうか疑問に思っていhtonf
ntohf
ます。
私がターゲットとするプラットフォームはほぼ確実float
に 32 ビットで表現されることはわかっていますが、将来のプロジェクトで使用できるように、現在記述しているコードを可能な限り互換性のあるものにしたいと考えています。
c# - フロートをバイトに量子化する最良の方法は何ですか
単精度浮動小数点値があり、この値が生成されたサンプルの分布に関する情報がないため、シグモイドを適用したり、ある種の正規化を実行したりできません。また、値が常に負でないことも知っています。このフロートをバイトとして表現する最良の方法は何ですか?
私は次のことを考えました:
float を UInt32 として解釈し (これにより、数値間の相対的な順序が維持されることを期待しています。間違っている場合は修正してください)、バイトの範囲にスケーリングします。
コメントやその他の提案をいただければ幸いです。ありがとう!
c++ - C++ 浮動小数点の丸め (エラー?)
乗算を使用する理由
なぜ b は 104.99999 で 105.0 ではないのですか?
そして私が
f は 104