- PR -

計算結果があわないです。

投稿者投稿内容
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-02-09 00:10
解決してますが情報として書いておきます。

COBOLプログラムでの数値表現は、Edossonさんとnagiseさんがおっしゃられているようにパック10進で表現することが多いです。
多いと書いたのは、COBOLの10進計算というメリットを失うためあまり利用されていないようなのですが、2進表現も可能なためです。

丸め誤差は10進を採用しているCOBOLでも、計算結果の格納領域が限られているために生じる可能性があります。
丸めは四捨五入により行われます。
しかしながら、COBOLの除算命令DEVIDEにはいくつかの記法があり、その中に剰余を別変数に格納するというものがあります。
当然商の小数点以下有効桁数が除算もとのそれより多いことが条件になりますが、これを使用すると誤差を生じず計算することが出来ます。

そういえば以前、内部計算を10進で行うというコンピュータの話をどこかで聞いたような気がするのですが実在するのでしょうか。
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 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
杏仁豆腐
常連さん
会議室デビュー日: 2003/10/04
投稿数: 48
お住まい・勤務地: あっち・なぜか平和だったところ(T_T)
投稿日時: 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ページ超えてます。

深く理解しようとすれば、それ相応の時間が必要です。
こういうことの、ちょうど良い勉強の程度はどの辺り何でしょうね。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-02-09 10:56
引用:

そういえば以前、内部計算を10進で行うというコンピュータの話をどこかで聞いたような気がするのですが実在するのでしょうか。


いわゆるメインフレームって奴はそうですよ。そういう命令セットがある。
そもそも国際ビジネス機械株式会社製ですからね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-09 12:51
浮動小数点がらみでもうひとつ。

あまりメジャーではないと思いますが、Javaにはstrictfpという予約語があります。
いまどきのCPUは浮動小数演算をサポートしているわけですが、
この実装が「厳密な」Javaの規格の浮動小数演算の結果と異なる場合があります。
非strictモードでの浮動小数演算では緩和された制約で動作しますので
CPUの浮動小数演算ユニットを直接使って高速化される場合があります。
逆にstrictfpキーワードがついている場合はどのJavaVMで実行しても
正確に同じ値を返します。
このあたりも浮動小数の誤差が絡む話ですね。

昔、ポリゴンを自力で描いたときにマシンによって挙動が違うことがありました。
マシンによっては回転させるとポリゴンがばらばらになっちゃうんですね。
連続的な回転処理による誤差の蓄積という話もあるのですが、
その際の挙動の違いは非strictモードによるものでした。

もし、マシンによって浮動小数演算に誤差が出るようでしたら
このあたりについても調べてみるとよいでしょう。

コード:
    /** 非strictモード */
    public double hoge(double a, double b) {
        return a * b;
    }
    /** strictモード */
    public strictfp double piyo(double a, double b) {
        return a * b;
    }

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2007-02-09 18:00
> そういえば以前、内部計算を10進で行うというコンピュータの話をどこかで聞いたような気がするのですが実在するのでしょうか。

検索語 intel asm BCD
二進化十進の演算命令をもつ MPU は普通にあります、
小さなコントローラでも 10進一桁どおしの演算命令(または補助する命令)を持ってます。
ただ、汎用機COBOLの「固定長処理の世界」を再現するような、ソフトが存在しないだけです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-02-09 22:04
出遅れましたが、言語のデフォルトは、
double num1 = 1.2;
じゃなくて
double num1 = 1.0011001100110011001100110011001100110011001100110011B;
みたいにすべきだったのかもしれません。
こうしておけば、循環小数であることが一目瞭然です。

#16進数でも可。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2007-02-09 23:57
見解の相違なんでしょうが、「十進で内部計算を行う」といわれて
BCD形式での演算がそれに該当するとはわたしには判断できませんでした。

360(正確には互換機)のアセンブリ言語も8080/Z80もいじりましたので、
BCD形式の数値を演算できたりすることができるのは知っていました。
しかし、80系のそれは演算後に補正命令をかまさなければいけないし、
360のBCD演算もpack形式じゃなくて zone形式でないと計算できないのでは
なかったでしょうか?
#遠い昔のことなので忘れました。

前回の発言の後で思い出したのですが、6502というマイクロプロセッサは
数値演算を本当に十進で行うモードが存在します。わたしは6502の互換
チップは使ったことがありますがそれでは十進モードは削られていたので
実際に使ったことはありません。
まあいずれにしろ、今回問題になっているのは浮動小数点数なので
整数の範囲で云々というのはちょっと違うかもしれません。

ちなみに前回挙げた ENIACは
引用:

ENIAC used ten-position ring counters to store digits; each digit used 36 tubes,
10 of which were the dual triodes making up the flip-flops of the ring counte


なので、本当に十進が基準になっています。

スキルアップ/キャリアアップ(JOB@IT)