matlabのシンボリックツールボックスを使用しているときに、次の奇妙なことに遭遇しました
/ >> syms e
/ >> y = 11111111111111111 ^ e
y = 11111111111111112 ^ e
多数を扱う場合には制限があるようです。セージのような完全に異なるシステムに変更することなく、これを解決できますか?
matlabのシンボリックツールボックスを使用しているときに、次の奇妙なことに遭遇しました
/ >> syms e
/ >> y = 11111111111111111 ^ e
y = 11111111111111112 ^ e
多数を扱う場合には制限があるようです。セージのような完全に異なるシステムに変更することなく、これを解決できますか?
問題は、Matlabが数値をシンボリック式に変換する前にdoubleに解析することだと思います。ダブルには52ビットの仮数があるため、有効数字は約16桁ですが、数値は長くなります。
別の方法として、文字列から直接番号を作成することもできます。
y=sym('11111111111111111')^e
残念ながら、現在Matlabを利用できないため、この回答はテストされていません。
これはバグではなく、機能です。そして、それは「丸め誤差」と呼ばれます
matlabは、Cプログラミング言語やC ++などの他の多くの言語のdoubleと同様に、double形式を使用して正規変数を格納します。
実際、次のように、「バグ」は「^x」とは何の関係もありません。
>> clear
>> syms y
>> format bank
>> y=11111111111111111
y =
11111111111111112.00
単純な割り当てでさえ、「バグ」を引き起こします。
そして、デバッグモードを使用して、VSのメモリにdouble変数が実際にどのように格納されているかを確認できます。
スクリーンショットでわかるように、aとbの両方がメモリに「2ea37c58cccccccc」として保存されます。これは、コンピュータが一方を他方から区別できないことを意味します。
そして、それがあなたが見つけた「バグ」の理由です。
これを回避するには、代わりにシンボリック定数を使用できます。
>> y=sym('11111111111111111')
y =
11111111111111111
このようにして、コンピュータは「y」を別の形式でメモリに格納します。これにより、丸め誤差が回避され、メモリのコストが増加します。