小数点以下の計算がおかしい(Ubuntu)

スプレッドシート (Calc) について
返信する
macaronipenguin
記事: 4
登録日時: 10月 29, 2010, 10:30 am

小数点以下の計算がおかしい(Ubuntu)

投稿記事 by macaronipenguin »

この報告をするためだけにOpenOfficeコミュニティフォーラムに登録した者です。
普通のOpenOfficeのユーザーですので、この様な場に慣れていません。
失礼もあるかもしれませんが、よろしくお願いいたします。

本題です。
この現象はUbuntu版のみに発生しています。
Windows版ではこの現象はおきませんでした。

A1セルに「0」を入力します。
A2セルに「=A1+0.1」を入力します。
A2セルをコピーしてA3セルからA62セルに張り付けます。
A62セルにカーソルを持っていきます。
A62セルを見るだけだと問題ないように思えますが、下の合計の欄を見ると「6.09999999999 」となります。
さらにA62セルをコピーして「形式を選択して貼り付け」で計算式のチェックボックスを外して数字のみを別のセルに張り付けると「6.09999999」がコピーされてしまいます。

再度言いますが、Windows版ではこの現象は起きませんでした。
Ubuntu版のみです。

使用しているUbuntuはUbuntu10.04LTSとUbuntu Netbook Edition 10.04です。
どちらも同じ現象が出ました。
OpenOfficeは3.2.0です。
よろしくお願いいたします。
OpenOffice 3.2.1 on WindowsXP
OpenOffice 3.2.0 on Ubuntu 10.04 LTS
blog:http://blog.goo.ne.jp/soratobu_macaronipenguin
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by MoIshihara »

macaronipenguin さん こんにちは ここは普通のユーザーが集まる場です、お気軽にどうぞ

・問題は2つあると思います、1つは誤差の問題、もう1つは[数の書式]の問題です。

・誤差に関しては、WindowsXP + OOo3.2.1 でも同様の結果になります、[数式バー]で確認して下さい。
小数点以下の計算がおかしい(Ubuntu).PNG
小数点以下の計算がおかしい(Ubuntu).PNG (10.46 KiB) 閲覧された回数 22944 回
・OpenOffice に限らず、他のアプリケーションでも実数演算を行う場合には、誤差に対する注意が必要です、
 例えば VBScript でこの様にプログラムを作成し実行すると、

コード: 全て選択

a = 0
b = 0.1
for i = 0 to 60
	a = a + b
next
Msgbox FormatNumber(a, 14)
 この様な結果になります。
小数点以下の計算がおかしい(Ubuntu)2.PNG
小数点以下の計算がおかしい(Ubuntu)2.PNG (3.32 KiB) 閲覧された回数 22944 回
・0.1 は2進数では(割り切れない為)正確な値にならず誤差が含まれているのです。

・数の書式に関してですが、ステータスバーの合計表示は、(XP+OOo3.2.1の場合)選択セルの書式が反映されている様です。
・A62セルの書式をどの様に設定しているのかを、教えて下さい。
macaronipenguin
記事: 4
登録日時: 10月 29, 2010, 10:30 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by macaronipenguin »

MoIshiharaさん、お返事ありがとうございます。

確かにWindows版でも下の合計の欄に表示されないまでも実際は誤差が発生していましたね。

確認するために古いPCを立ち上げてMS社の97年度版の表計算ソフトで同じことをしてみましたら、こちらもほぼ同様の現象が見られました。
ただ、こちらは6.1→6.099999でなく6.0→5.99999でしたので0.1だけ早く誤差が生じていました。

このような現象が容認されてしまうのですね・・・・
プログラムに関しては素人ですが、数字の変数を定義する時、整数だけを扱うのか、小数点も扱うのか設定することだけは知っています。
しかし、表計算ソフトはこのあたりを問題なくやってくれているものだと思っていました。

ご質問の書式に関しては最初は分類-数字で書式-Standard、それから小数点以下の桁数1桁、それから指数表記でもやってみましたが同じでした。
設定などでこの誤差を出さないようにはできないものなのでしょうか。
OpenOffice 3.2.1 on WindowsXP
OpenOffice 3.2.0 on Ubuntu 10.04 LTS
blog:http://blog.goo.ne.jp/soratobu_macaronipenguin
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by MoIshihara »

macaronipenguin さん こんにちは

・単純に四捨五入を行うのが一番手っ取り早い方法だと思います。
・例えば A2セルに、この様な計算式を設定します。

=MROUND(A1+0.1;0.1)
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by K.Tsunoda »

[ 0.1 ] 加算と決まっているなら、元値を10倍してから [ 1 ] 加算後に、10で割るという方法もあります。
=(A1*10 + 1) / 10

下記の記事も参考に

日経PC21 / エクセル(Excel)「演算誤差」対策講座
http://pc.nikkeibp.co.jp/pc21/special/gosa/
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by MoIshihara »

Tsunoda さん お久しぶりです。

参考になりました、ありがとうございます。
akionnpu
記事: 14
登録日時: 10月 9, 2010, 11:48 pm

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by akionnpu »

こんにちは^^
K.Tsunoda さんの言う通り、calcでは有効桁関連で9999・・・となっているみたいですね・・

calcの有効桁数が14桁みたいなので
14桁直近の値を取得する関数を作ってみました ;)


加算・減算を行った後に関数を呼んでみてください。

例)
=OPT(A1+0.1)


「形式を選択して貼り付け」で「数」を選択して
有効桁数14桁で直近の値が算出されずに
15桁で数が貼り付けられるのは個人的にはバグ扱いですが・・^^;
面倒なので、誰か拾ってくださいw


下記の関数の保証はしかねます^^;
ここ→「Int(log(v) / log(10))」に常用対数を使いたいのですが
見当たらないため精度がぶれるかもしれません・・・

個人的には有効桁数は15桁で「6.09999999999999」を
正として扱ってほしい思いがありますがw(LOG(2^(52+1))=15.954589770191のため15桁は精度として確保できるはず・・)
「999999999999999」を取り扱っていないため、Calcの思想上
有効桁数は14桁なのでしょう・・


^^;Calcもやっぱり15桁でしたw
斜線部分は誤りです。
なので15桁直近に変更しました♪

コード: 全て選択

Function opt(v As Double) As Double
	Dim offset as Double
	Dim vbk As Double
	If v = 0 Then
		opt = 0
	Else
		vbk = v
		If vbk < 0 Then
			v = -v
		End If
		offset = 10 ^ (14 - Int(log(v) / log(10)))
		opt = fix((v + .5 / offset) * offset) / offset
		If vbk < 0 Then
			opt = -opt
		End If
	End If
End Function
OpenOffice.org 3.2.0.10 OOO320m12 / Linux version 2.6.32-25-generic (buildd@rothera) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
macaronipenguin
記事: 4
登録日時: 10月 29, 2010, 10:30 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by macaronipenguin »

K.Tsunodaさんに紹介していただいた日経PC21 / エクセル(Excel)「演算誤差」対策講座を読みました。
全部を理解したわけではありませんが、シロウトなりに考えてみました。
小数点を2進数で管理しているから悪いのであれば、セルの数字データをユーザーの目の見えないところはA×10^Bという指数表記でデータを管理しておいて、見えるところはセルの表示設定どおりに小数点を表示していれば問題なかったような気がしますが、どうなんでしょう。
もしかしてIEEE 754で縛られてそのような仕様は無理なのかな。
どうしても、IEEE 754どおりの機能を載せなければいけないのでしたら、オプションの設定のところでユーザーに選べるようにしてもらえればいいと思うのですが。
誤差が当たり前の話をしている方がどうもおかしいと思います。

シロウトが余計なことを言いました。
すみません。
失礼でしたら、コメントを取り消します。
OpenOffice 3.2.1 on WindowsXP
OpenOffice 3.2.0 on Ubuntu 10.04 LTS
blog:http://blog.goo.ne.jp/soratobu_macaronipenguin
akionnpu
記事: 14
登録日時: 10月 9, 2010, 11:48 pm

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by akionnpu »

見えてるものを値としてコピーしたいだけであれば、次の手順で可能です。 :super:

(1)「形式を選択して貼り付け」から「すべて挿入」「リンク」を選択し、OKを押下
(2)メニューの[データ]-[テキストから列へ]で区切りのチェックをすべて外しOKを押下

ーーーーーーーーーーーー
誤差は必ず起こります。 :(
例えば1/9は10進数でも0.111111...という循環小数になります。

9進数で表現すると0.1という切りのいい数値になりますが。。


あと10桁表示の電卓で

[1000000000]+[ 0.3]=→[1000000000](情報落ち)
+[ 0.7]=→[1000000000]

ですが
[ 0.3]+[ 0.7]=→[ 1]
+[1000000000]=→[1000000001]

というように、何桁持つかということを決めた時点で持てない桁は誤差になります。

前提条件が小数点以下何桁で最大何桁等、前提条件が一意に決まれば
前提に対してシステムが作れると思いますが^^;

表計算ソフトのような汎用的なものは難しい気もします。
OpenOffice.org 3.2.0.10 OOO320m12 / Linux version 2.6.32-25-generic (buildd@rothera) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by MoIshihara »

macaronipenguin さん こんにちは

・blogを拝見した所、対数を用いた計算を行われている様でしたので、蛇足を付け加えておきます。
・超越関数(三角関数、対数等)無理数(π,√,е等)を含んだ計算を行う場合、誤差を見た目で判別しにくいので、さらに配慮が必要です。
・ユーザが、計算順序や式の簡素化に無頓着であっても正しい(誤差の無い又は可能な限り誤差の少ない)答えを返すアプリケーションとして「数式処理システム」と言う分野があります、Calc の様に数値で扱うのではなく、式そのものを保持して扱うので、式の簡素化、約分、計算順序の入れ替えをアプリケーションが自動で行ってくれます。
・「数式処理システム」でネット検索を行ってみて下さい。

・Wikiでしたら、こちらです。

数式処理システム
http://ja.wikipedia.org/wiki/Category:% ... 6%E3%83%A0
macaronipenguin
記事: 4
登録日時: 10月 29, 2010, 10:30 am

Re: 小数点以下の計算がおかしい(Ubuntu)

投稿記事 by macaronipenguin »

紹介していただいた、数式計算システムのmaximaを使って見ました。
Ubuntuには「Ubuntuソフトウェア」の中に登録されていましたので、簡単にインストールすることができました。

すごいですね。
こんなソフトがあるという事自体、夢にも思ったことがありませんでした。

いろいろな式を入れて動かしてみたのですが、きっちり答えが出てくる。
こんなソフトがオープンソースとして、自由に使わせてくれるなんて・・・・

ただ、肝心の抵抗-温度特性の計算式を入れると答えが帰ってこない・・・
exp関数にやたらデカい数字が入っているかららしいですが。

まぁ、これからコツコツとこの数式計算システムを使い込んでいこうと思っています。
ありがとうございました。
OpenOffice 3.2.1 on WindowsXP
OpenOffice 3.2.0 on Ubuntu 10.04 LTS
blog:http://blog.goo.ne.jp/soratobu_macaronipenguin
返信する

“Calc”に戻る