- - PR -
計算結果があわないです。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-02-09 00:10
解決してますが情報として書いておきます。
COBOLプログラムでの数値表現は、Edossonさんとnagiseさんがおっしゃられているようにパック10進で表現することが多いです。 多いと書いたのは、COBOLの10進計算というメリットを失うためあまり利用されていないようなのですが、2進表現も可能なためです。 丸め誤差は10進を採用しているCOBOLでも、計算結果の格納領域が限られているために生じる可能性があります。 丸めは四捨五入により行われます。 しかしながら、COBOLの除算命令DEVIDEにはいくつかの記法があり、その中に剰余を別変数に格納するというものがあります。 当然商の小数点以下有効桁数が除算もとのそれより多いことが条件になりますが、これを使用すると誤差を生じず計算することが出来ます。 そういえば以前、内部計算を10進で行うというコンピュータの話をどこかで聞いたような気がするのですが実在するのでしょうか。 | ||||
|
投稿日時: 2007-02-09 00:29
わたしが知っている限りでは ENIACが十進数で演算を行っていたはずです
#ENIACが今日的な意味で「コンピューター」であるかどうかはおいといて 浮動小数点演算については 浮動小数点演算について http://docs.sun.com/source/806-4847/ncg_goldberg.html が詳しいです。 それから、基数が10の浮動小数点数の表現形式が提案されています。 http://ja.wikipedia.org/wiki/IEEE_754r | ||||
|
投稿日時: 2007-02-09 01:57
Edossonさん、nagiseさん、暁さん
COBOLの情報ありがとうございます。 積読を引っ張りだしてみたら。 Write Great Code〈Vol.1〉の「第4章 浮動小数点表現」で33ページ。 The Art of Computer Programming (2) 日本語版の 第4章−4.2.浮動小数点数演算で48ページ、 第4章 数値演算 全体だと500ページ超えてます。 深く理解しようとすれば、それ相応の時間が必要です。 こういうことの、ちょうど良い勉強の程度はどの辺り何でしょうね。 | ||||
|
投稿日時: 2007-02-09 10:56
いわゆるメインフレームって奴はそうですよ。そういう命令セットがある。 そもそも国際ビジネス機械株式会社製ですからね。 | ||||
|
投稿日時: 2007-02-09 12:51
浮動小数点がらみでもうひとつ。
あまりメジャーではないと思いますが、Javaにはstrictfpという予約語があります。 いまどきのCPUは浮動小数演算をサポートしているわけですが、 この実装が「厳密な」Javaの規格の浮動小数演算の結果と異なる場合があります。 非strictモードでの浮動小数演算では緩和された制約で動作しますので CPUの浮動小数演算ユニットを直接使って高速化される場合があります。 逆にstrictfpキーワードがついている場合はどのJavaVMで実行しても 正確に同じ値を返します。 このあたりも浮動小数の誤差が絡む話ですね。 昔、ポリゴンを自力で描いたときにマシンによって挙動が違うことがありました。 マシンによっては回転させるとポリゴンがばらばらになっちゃうんですね。 連続的な回転処理による誤差の蓄積という話もあるのですが、 その際の挙動の違いは非strictモードによるものでした。 もし、マシンによって浮動小数演算に誤差が出るようでしたら このあたりについても調べてみるとよいでしょう。
| ||||
|
投稿日時: 2007-02-09 18:00
> そういえば以前、内部計算を10進で行うというコンピュータの話をどこかで聞いたような気がするのですが実在するのでしょうか。
検索語 intel asm BCD 二進化十進の演算命令をもつ MPU は普通にあります、 小さなコントローラでも 10進一桁どおしの演算命令(または補助する命令)を持ってます。 ただ、汎用機COBOLの「固定長処理の世界」を再現するような、ソフトが存在しないだけです。 | ||||
|
投稿日時: 2007-02-09 22:04
出遅れましたが、言語のデフォルトは、
double num1 = 1.2; じゃなくて double num1 = 1.0011001100110011001100110011001100110011001100110011B; みたいにすべきだったのかもしれません。 こうしておけば、循環小数であることが一目瞭然です。 #16進数でも可。 ![]() -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||
|
投稿日時: 2007-02-09 23:57
見解の相違なんでしょうが、「十進で内部計算を行う」といわれて
BCD形式での演算がそれに該当するとはわたしには判断できませんでした。 360(正確には互換機)のアセンブリ言語も8080/Z80もいじりましたので、 BCD形式の数値を演算できたりすることができるのは知っていました。 しかし、80系のそれは演算後に補正命令をかまさなければいけないし、 360のBCD演算もpack形式じゃなくて zone形式でないと計算できないのでは なかったでしょうか? #遠い昔のことなので忘れました。 前回の発言の後で思い出したのですが、6502というマイクロプロセッサは 数値演算を本当に十進で行うモードが存在します。わたしは6502の互換 チップは使ったことがありますがそれでは十進モードは削られていたので 実際に使ったことはありません。 まあいずれにしろ、今回問題になっているのは浮動小数点数なので 整数の範囲で云々というのはちょっと違うかもしれません。 ちなみに前回挙げた ENIACは
なので、本当に十進が基準になっています。 |