
No.6ベストアンサー
- 回答日時:
見つかりました。
以下のリンクが参考になると思います。
Solarisではデフォルトでどうなのかまでは知らないので、
ひょっとして的外れの可能性はありますが参考になれば。
Gauche:拡張浮動小数点演算の謎
http://practical-scheme.net/wiliki/wiliki.cgi?Ga …
FreeBSD QandA 587
http://www.jp.freebsd.org/QandA/HTML/587.html
PHPのround関数の謎が少し解けた - hnwの日記
http://d.hatena.ne.jp/hnw/20070603
最初のリンクから。
---
86系の浮動小数点演算ユニットのレジスタは80bitの拡張浮動小数点数 (仮数部64bit)で、floatでもdoubleでも演算は一度80bitに直してから行われ、結果が単精度または倍精度に丸められる。ところが、ある種の最適化が行われた場合、途中結果が浮動小数点レジスタに置いたままにされるため、80bitのまま演算が進行する。
その値をスタック経由で関数に渡す時にはdoubleに丸められるので、 printfに渡して印字させるだけでは違いがわからなかったのだ。
この現象はコンパイラの最適化に依存する。この例でも、-O2をつけなければ違いは発生しないし、mult10()の呼び出しをただの乗算に置き換えても発生しない。また、FreeBSDなどではプロセスの浮動小数点演算モードを明示的に拡張浮動小数点数を使うように設定してやらねばならないようである。
---
リンクの件わざわざありがとうございます。
明日会議の席上でこの誤差について説明する予定なので、
とても助かりました。
回答はこれにて打ち切りとさせていただきます。
皆さん本当にありがとうございました。
No.5
- 回答日時:
Windows xp は x86で間違いないとして、Solarisの方もCPUはx86ですか?
#7ってx86版あったっけ?
もしそうだったとして、以下のような可能性があります。
x86の浮動小数点数演算は80bitの精度で計算できます。
double と書くと 64bit精度になりますが、CPUの内部では80bitの
精度で計算されています。
これを変数の領域に取り出したりするときに 80bit → 64bitの
変換がかかります。
このとき浮動小数点数の演算をするときに、コンパイラが最適化をして
できる限り 80bit→64bitの取り出しをしないで計算するコードを
出力した場合と、いちいちこの変換をしながら計算を進めるコードを
出力した場合に、微妙に最下位の方の値が変る可能性があります。
たしかFreeBSDあたりでこの辺が原因のバグだかなんだかが
あったような記憶があります。
#一応調べてみます
って、単精度だから32bitか。
アセンブリ言語読める人を捕まえて、コードを解析して貰ったら良いかと。
回答ありがとうございます。
知人から「CPUの最適化がどうこう」ということを聞いたのですが、知人自身も最適化がどういうことかよく分からないと言っていました。
この頂いた回答で最適化の意味が分かりました。
単精度においても「コンパイラが最適化をしてできる限り 80bit→32bitの取り出しをしないで計算する場合とそうでない場合がある」ということがあるとすれば説明が付くような気がします。
No.4
- 回答日時:
#2です。
Solaris7と聞いててっきりSparcと思ってましたが、
質問文を見返すと必ずしもそうではないですね。
もしCPUが違えば#2の通りですが、もし同じならまず実行したコードの差が考えられます。
アルゴリズムやコンパイラ、オプチマイズなどに起因した計算内容の差異です。
演算の順番が違っただけで演算結果は違ってきます。
またもしかしたら数値の標準形式がSolarisとXPで違っているかもしれません。
結果を求めた後でその変換をするとそこで差が出ることもあり得ます。
再度の回答、ご丁寧にありがとうございます。
すみません、私が質問に書き漏らしたのですがプログラムも同一のものなのでアルゴリズムの差ではないと思います。
身近な人に聞いたところ「OS、コンパイラの相違による差異」という答が多く、原因はやはりこの辺らしいです。
No.3
- 回答日時:
数値計算の入門書のはじめの頃に乗っているはずですが
計算機eの問題です。
単精度実数は、7.2桁ですから、無限小数(2新法で考えてくたざい)の取り扱いなので、実数部4桁ですと小数部2桁目付近で十進化・二進化の誤差が出てきます。その後の演算で、二進演算の誤差が出てきます。
これも、使っている計算機で変わるので、一概に言えません。
WinXpの使用経験はありませんので、異なっている場合があります。
No.2
- 回答日時:
内部データの形式と浮動小数点演算仕様の差に起因すると思います。
丸め誤差は出るかもしれませんが、データの形式と演算仕様が同じなら、
同じ丸め誤差が発生し、差は出ないはずです。
たぶん単精度ということなら両方とも指数1Byte + 仮数3Byteの計4Byteだと思います。
仮数の形式は符号+絶対値だったり、2の補数表現だったりします。
指数は2の補数表現だったり+128のバイアスがかかっていたりし、また基数が2だったり16だったりします。
さらに、演算途中でガードディジットを持ったり持たなかったりで、
精度に差が出ます。
大まかな差異原因はそんなところでしょう。
ちなみに、もしAMDがインテルの完全互換だったら、差は出てはいけないはずです。
もし差が出たら、完全互換とは言えません。
ご回答ありがとうございました。
Solaris7とWinXPで違いが発生する可能性のある箇所が具体的に記述されているので、非常に助かりました。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 3つの倍精度浮動小数点値の平均を求めて、3つの引数全てを平均値に変更するメソッドを作成し、キーボード 1 2022/07/13 16:04
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) VBA 1 2023/01/19 16:19
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- 物理学 RC直列回路の実験で理論値と測定値の時定数を計算した結果±12%と大きな誤差が生じたのですがその原因 3 2022/09/29 22:32
- JavaScript 最小二乗法 2 2023/01/01 20:57
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- 物理学 時定数で実験で求めた値と理論値に誤差が生じる理由はなんですか?自分は実験で使用した抵抗やコンデンサの 3 2022/09/26 11:32
- Java Java 年数計算 3 2023/01/28 10:52
- 数学 至急!研究の統計について 6 2023/07/12 00:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビットデータの取得方法について
-
2アドレス方式について
-
DoJaで多倍長演算する方法
-
PS3に搭載されている"Cell"は、...
-
fortranで**の意味は?
-
数値計算における誤差について
-
上位ビットと下位ビットの入れかえ
-
プログラム
-
0xffffとは?
-
一定のバイト列から指定サイズ...
-
Python: 数値を反転させたい
-
C言語のビット演算子に関して
-
C言語で128bitの2進数のビット...
-
アルゴリズムの計算量とオーダ
-
fortran
-
浮動小数点演算と固定小数点演...
-
ビットシフトってどんな時使うの?
-
インラインアセンブラの関数に...
-
PowerPC用逆アセンブラを知りま...
-
実行ファイルからソースはみれる?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
C言語で128bitの2進数のビット...
-
ビットシフトってどんな時使うの?
-
文字参照は10進数と16進数では...
-
エクセルVBAのIf,Then 構...
-
03分22秒36のような時間の単位...
-
一般のソフトで画像を扱う場合...
-
C言語やC++言語でビット毎に値...
-
シーケンス制御についての質問...
-
PS3に搭載されている"Cell"は、...
-
ビット演算子
-
Endianについて パート2
-
verilog 符号付加減算(最上位...
-
ビットの取り出し方法
-
PLC 命令について
-
命令について
-
符号無し整数xを右にnビット回転
-
16ビットCPUで32ビットの計算方法
-
浮動小数点数の内部表現につい...
おすすめ情報