Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

型と端数処理

計算結果に思う
ネタ元
ここ
ここ
すっかり存在を忘れてました。BBSの会話の中で 53bit演算、64bit演算の話が出てきます。
これって確か、コプロの制約じゃなかったかな、と資料を漁ったのですが、見あたらず。
80x87の記事も殆どなく、うろ覚えの投稿になりますが....orz;
 x86系CPUは浮動小数点演算が出来ませんでした外付けの数値演算プロセッサとしてx87系列としてoption扱いで存在してました。
x87を積んでないコンピュータはソフトでカバーしてました。それがいつのころか、CPUと一体になってからは、コプロの話が殆どされなくなりました。
呼び出しシーケンスすら忘れましたが、呼び方で24bit/53bit/64bitの指定ができたような気がします。
なぜ、windows系か53bitにしたのかは知りません。調べも付きませんでした。wwww.  不思議です。
当のbbsの中で >V6.0ではCPU内部で80bit浮動小数点 とあるのですが  80bit モードって VBはコプロを使わない独自演算だったのかなぁ。
 コプロの話題自体が昔話になった現在では、過去の柵の一言で片付けられてしまいそうです。
 Windows場合、コプロを使うのか、ライブラリを使うのか、不明でした   ここ
誤差の原因は皆様の探求心の凄さで判明したようです。お疲れ様でした。
しかし。問題は、原因の解明以外にもありそうです。
 IT開発者や理系の人には、有効数字という概念が身についています。二進数で表現できない数値は桁落ちが生じるのは基礎知識ですよね。(って断言しましたがごめんなさい。)
しかし、それはこちら側の見方であって、非理系で一般的な業務利用者は知らない事かも知れません。
その人たちに、仕組み上の問題で、誤差が出るのは不可避です。といっても、理解を得にくいです。
そのために、コボルなどの言語ではBCD(二進化十進表現)という形式が存在します。
 .netの世界では桁落ちしない数字として Decicmalがありますか、28桁保証とはいえ、内部表現は二進な気がします。違うかな?
ORACLEのNumericは38桁まで指定が可能です。しかし、.net側には対応する変数がない。限界値以上では桁落ちやabortは避けられません。
 数値の扱いや計算誤差、有効数字など、フレームワーク間の互換性がないから、ずっとついて回る問題ですね。
丸めも、世間一般では四捨五入なのに、IT屋で丸めと言えば、偶数丸めがデフォルトだったりします。
 業務面からみたら、事務処理に適応した結果が出れば良いので、問題視する視点が違ってくると思います。
100兆の単位の計算で銭単位まで誤差なく処理可能...というのがシステム条件のところがありました。これはdecimal型でもOKですね。
BCD計算が可能だからCOBOLが存在出来ているのかも知れません。
 全くのエンドユーザーが誤差問題を持ち出したとき、納得させることができるのでしょうか。「こんなもんですは」と誤魔化すことになるかも。wwwww....orz;
それにしても vb6.0が80bit演算んって..どこから来てるんだろう?

投稿日時 : 2008年6月5日 1:24

Feedback

# re: 型と端数処理 2008/06/05 11:19 nakaP

>ORACLEのNumericは38桁まで指定が可能です。
SQLServerもそうですよね。

>しかし、.net側には対応する変数がない。限界値以上では桁落ちやabortは避けられません。
これって、アプリケーション側が主になるんじゃないかなと思います。
アプリケーション側では操作できるのにDBに登録できない、というのを避けるために余裕(?)を持たしてるんじゃないかなと思っています。

# re: 型と端数処理 2008/06/05 11:41 らふぁ

偶数丸めはどっちかっていうと金融から?

>業務面からみたら、事務処理に適応した結果が出れば良いので、問題視する視点が違ってくると思います。
これと直接関係ないですが、電算機を使用した所得税の計算では
手計算と違う方法でもよい、としてそのやり方とかが示されてますよね。
#昔そゆのやったからついw
##高くて387買えなかったのでID

# re: 型と端数処理 2008/06/05 12:03 ognac

コメントありがとうごさいます。
クライアントアプリありきのRDBというのは、少し違和感を感じます。
端末アプリはFrameWork CLI以外にもあるので、対応型がないののは良くないかと。
クライアントアプリをコボルで作成すれば、38桁アプリも作れたのでは。(未確認ですが、)
他の言語を使って、35桁を扱うアプリが構築されていたら、C#/VBで扱えなくなるので、その面で問題ありと考えます。
偶数丸めは、トータル的に誤差を少なくする意味で、価値があります。

# re: 型と端数処理 2008/06/05 13:11 nakaP

>クライアントアプリをコボルで作成すれば、38桁アプリも作れたのでは。(未確認ですが、)
あそっか、その可能性もありますね。
.Netだけで考えてましたorz

# re: 型と端数処理 2008/06/05 21:52 めたぼ なら

> .netの世界では桁落ちしない数字として Decicmalがありますか、28桁保証とはいえ、内部表現は二進な気がします。違うかな?

内部表現もきちんと10進ですよ。

C# Language Specification(CSharp Language Specification.doc)にこうあります。
> A decimal is represented as a 96-bit integer scaled by a power of ten.

全128ビット中1ビットが符号、96ビットが値、8ビットが10の累乗数で、残りは未使用です。

# re: 型と端数処理 2008/06/05 21:52 裏口

>クライアントアプリをコボルで作成すれば、38桁アプリも作れたのでは。(未確認ですが、)

ココ違います。
COBOLの十進数はMAX18桁です(メインフレーム系)。
# 一応事務処理計算用ということと十進表現の数値で演算可能にする命令セットの制約かと思いますが未確認。

仮数部の桁数が演算結果に影響するケースは分子力場計算等、最小二乗法が含まれるケースですね。
# 昔スパコンでやらせてたCPU負荷が高い処理だけど最近じゃパソコンでも出来そうな希ガス。

# re: 型と端数処理 2008/06/06 0:46 通りすがり

http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf

の 4.2.2 浮動小数点データ型

> 80bitの演算

# re: 型と端数処理 2008/06/06 1:06 Ognac

皆様、ご指摘ありがとうございます。感謝でいっぱいです。

>全128ビット中1ビットが符号、96ビットが値、8ビットが10の累乗数で、残りは未使用です。 Remove これだと xxxx * 10^n となり xxxは96bit の二進のような希ガス...誤認かな。

>COBOLの十進数はMAX18桁です(メインフレーム系)。
一応事務処理計算用ということと十進表現の数値で演算可能にする命令セットの制約かと思いますが

18桁でしたか。完全忘却でした。...orz
上限の桁を決めないと、収集が付かなくなりますものね。

>4.2.2 浮動小数点データ型

ありがとうございます。まさに見つけられなかった資料です。

通りすがりさんの資料調査力には、いつも感服してます。

# re: 型と端数処理 2008/06/06 1:18 Pasie.

Decimalは小数点付きlongって感じで私は理解してます。

あと、基本的に開発ではdecimalを標準にしてて、doubleは使わないようにしています。以下のようなコードではまる人が多いからです。

Dim d, dsum As Double

d = 0.1R
For i As Integer = 1 To 10
  dsum += d
Next

Debug.Print(dsum) ' "1"ですね
Debug.Print(Int(dsum)) ' "1"ですか?

見た目"1"何だけど実は違う。浮動小数点形式がなんたるかを分かっていれば当たり前の話なんですが、どうしても見た目にやられてしまう。そういう事件が結構あります。上記のような単純なコードではだまされませんが、いろいろな計算ロジックを通った後に、if (dsum = 1.0R) then ~とかしていたりすると終わってしまうって話ですね。

95%くらいの事例はfloat系は使わなくても事足るんじゃないかとおもっていたりする今日この頃です。

# re: 型と端数処理 2008/06/06 8:12 Ognac

再度..誤認してました。

>全128ビット中1ビットが符号、96ビットが値、8ビットが10の累乗数で、残りは未使用です

xxxx * 10^n
で xxxが整数を表現できるから、 10進演算なんですね...orz.
納得です。

>95%くらいの事例はfloat系は使わなくても事足るんじゃないかと

金額業務系ては、皆無に近いと感じます。それなのに double系でコーディングする人がいるのは、サンプルがそうだからか。
記事でも書きましたが、有効桁数という概念の浸透度って案外低いんだなって感じます。

# re: 型と端数処理 2008/06/06 19:46 Pasie.

有効桁数とか精度とかもあるけど、致命的なのは例えば0.1が無限小数だと気づいていない人が多いことじゃないかと思っています。

とはいうものの、d = (1 / 10) *10、とかだとちゃんと1になるあたり説明が難しいですよね。骨が折れます。

p.s.
くだらない話ですが、有理数型とか複素数型とか行列型とかサポートしないですかね。男のロマンで!。あっても使わないと思いますが -_-;;

# re: 型と端数処理 2008/06/07 1:02 Ognac

2^n 乗で表現できないものは、端数切り捨てられるのは常識......技術者にとっては.....一般には理解をえられない..orz
複素数や行列型は Fortranのライブラリーにありました。学生の時使っていました。標準だったのか、部署独自だったのかは不明。
有理数型は定義が難しそう。ほかに分数型というのがあって、循環小数は分数型で表現してましたね。

タイトル
名前
Url
コメント