Numbersの有効桁数を超える数値の計算方法について

他の方が質問した回答を読み、15桁を超える数値は丸められてしまうと知りました。しかし、そこではそのような数値を計算する際の回避方法は書かれていませんでした。

何か、方法はないでしょうか?


具体的には例えば


10,644,900,609,172,830 → これは 10,644,900,609,172,800 と丸められてしまいます。


この数値を割っていくのですが、4で割っても2,661,225,152,293,210となり、正しく計算できません。

投稿日 2022/05/30 03:59

返信
返信: 11

2022/05/30 21:24 唯17 への返信

> 回避方法はないという指摘もありました。桁処理を行なって巨大数を上位桁と下位桁に分割してそれぞれを計算し、それを桁処理を行なってConcatenate()するしかないでしょうかね?


Numbersでの実行が必要ならそういうことになるでしょうけど、結構難しそうですね。

Numbersの変わりにはなりませんけど、単発の計算でよければ色々な計算機アプリが出ていますね。

例えば Big Number Calculator は整数の四則演算に限られますが、66000桁までサポートするそうです。


2022/05/30 22:15 唯17 への返信

2019年に以下の記事が出てます。

Apple、2019年6月のアップデートでNumbersなどに採用された128ビット計算エンジンについて説明。

この記事の元のAppleのリリースは、

Pages、Numbers、Keynote の計算の精度向上について - Appleサポート

と思います(このサポート記事自体はapplech2の記事より後のもので、リリースの最終バージョンということ?)。

本当に128bit 10進浮動小数点(4倍精度浮動小数点)で計算してるなら、10進で30桁以上の精度があるはずです。

IEEE 754 - Wikipedia

でも実際には15桁で丸めてます。表計算ソフトでは計算精度と同時にどれくらいのデータを扱えるかも重要じゃないでしょうか。いくら高精度で計算できても、少数のデータしか扱えないようでは表計算ソフトの価値は大幅に減ぜられてしまいます。表計算ソフト全体として128bit 10進浮動小数点でデータを扱うと、個々のデータは2倍になります(16バイト)から、扱えるデータ量は半分になってしまいます。なので、データとしてストアしてるのは64bit(倍精度浮動小数点、8バイト)で扱ってるのかなと思います。Appleのサポート記事では、128bitで計算してるということはさりげなく書いてるだけです。128bitなら30桁以上の精度があるやろ、と突っ込まれることを避けてるとしか思えません。関数の計算結果で15桁を保障するには、128bitでの計算が必要ということもあるのかもしれませんけど。だから内部的には128bit4倍精度で計算できるのでしょうけど、その使い方は一般ユーザには解放されてません。

10進数で15桁の精度しかないことはExcelでも同じです。

浮動小数点演算が Excel で不正確な結果をもたらす可能性がある - Microsoftサポート

現状では、表計算ソフトの限界でしょうか?

2022/05/30 19:51 品川地蔵 への返信

品川さん

ありがとうございます。

JavaScriptの情報があったので、それを元にいろいろと調べてみているところです。

-----引用-----

JavaScriptの数値型は内部で倍精度浮動小数点数を使用しており、整数を正確に表せる最大値(MAX_SAFE_INTEGER)は、 2^53 - 1、つまり9007199254740991(16桁・約9007兆1993億)となっています。 それを超える数値は丸め処理が行われるため、内部ではどんな数値も必ず偶数になります。

-----引用終わり-----


私が試してみたところ、Numbersではもっと小さな値で限界となるようです。

Numbers においては10進法で15桁までが丸められない数値のようです。

999,999,999,999,999に2を加えたところ、1,000,000,000,000,000となりました。末尾の1が丸められて0となっています。


999,999,999,999,999を100倍すると99,999,999,999,999,900と出ますが、それに49を加えても99,999,999,999,999,900のままですが、50を加えると100,000,000,000,000,000となります。599まで加える数字を増やしても計算結果は変わりません。600を加えると初めて100,000,000,000,001,010となります。


この大きな数におけるこの計算結果を回避する方法はまだ分かりません。


回避方法はないという指摘もありました。桁処理を行なって巨大数を上位桁と下位桁に分割してそれぞれを計算し、それを桁処理を行なってConcatenate()するしかないでしょうかね?

2022/05/30 17:22 やすどん への返信

B欄に最初から , 付きで入力していませんか? その場合文字列として認識されるので、

丸められることはありません。カンマ無しでも16桁以上になると文字列として認識されます。

フォーマットを自動でなく、数字と指定すると丸められますね。


追記:文字列として表示されていても、数式で参照するときは数値に変換されます。

2022/05/31 07:52 唯17 への返信

ごめんなさい。私の勘違いでしたね。

データフォーマットを数字にすれば丸め込まれます。


やはりNumbersには回避方法はありませんか。

個別に回避方法を検討するしかないと思います。

一つの対策で全ての場合に対応できないのははにさんのかかれたリンク先にもある通り、仕様ですので無理ですね。

いま作成しているシートで何が問題になっているのかを具体的に書くとヒントになるかも。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

Numbersの有効桁数を超える数値の計算方法について

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。