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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
verilog 符号付加減算(最上位...
-
10進数(+-)→2進数への変換(2)
-
ビットシフトってどんな時使うの?
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
sambaのパーミッション設定につ...
-
CASLのビットマップについて
-
VBScriptでの整数型価格データ...
-
情報源符号化について
-
1の補数
-
上位ビットと下位ビットの入れかえ
-
一般のソフトで画像を扱う場合...
-
シーケンス制御について質問で...
-
PLC 命令について
-
いまいちビット演算の目的が分...
-
三菱シーケンサーの命令でFROM ...
-
68000アセンブリについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
A4 持ち込み
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
符号無し整数xを右にnビット回転
-
C言語で128bitの2進数のビット...
-
シーケンス制御についての質問...
-
PLC 命令について
-
命令について
-
Python: 数値を反転させたい
-
情報科学の飽和演算、ラップア...
-
1の補数
-
03分22秒36のような時間の単位...
-
ビット立つの意味
-
verilog 符号付加減算(最上位...
-
上位ビットと下位ビットの入れかえ
-
シーケンス制御について質問で...
おすすめ情報