2

Matlabでバグを見つけたと思います。私の唯一の説明は、matlabが表示されている値以外の値を使用して内部的に計算することです。

K>> calc(1,11)

ans =

   4.000000000000000

K>> floor(ans)

ans =

     3

表示されるコードは、Matlabコンソールからの出力です。calc(x、y)は、double値の単なる配列です。

4

3 に答える 3

8

MATLABは、標準のIEEE浮動小数点形式を使用してdoubleを格納します。

4からわずかな量を引くと、MATLABは結果として4を表示します。

>> format long g
>> 4 - eps(2)
ans =
                         4

実際、MATLABは数値をバイナリ形式で格納します。その数の10進数バージョンは次のように表示されます。

>> sprintf('%.55f',4-eps(2))
ans =
3.9999999999999995559107901499373838305473327636718750000

明らかに、MATLABはその混乱した数字全体を表示するべきではありませんが、結果を15桁に丸めることにより、表示用に4が得られます。

明らかに、calc(1,11)の値はそのような数値であり、表示されている4に丸めるには少なすぎる髪の毛で、内部的に4未満として表されますが、正確には4ではありません。

浮動小数点演算では、結果の最下位の表示桁を絶対に信頼しないでください。

編集:

MATLABの3.99999999999999は4未満である必要があると思われるようです。論理的には、これは理にかなっています。しかし、その番号を指定するとどうなりますか?AHはい、浮動小数点doubleの粒度はそれよりも大きくなります。MATLABは、それを4未満の数値として表すことはできません。内部でその数値を正確に4に切り上げます。

>> sprintf('%.55f',3.9999999999999999)
ans =
4.0000000000000000000000000000000000000000000000000000000
于 2012-09-26T23:05:20.220 に答える
3

得られたのは、4に非常に近いが4未満の値であり、format longMatlabを使用した場合でも、数値を表示するには15桁に丸める必要があります。これを試して:

format long
asd = 3.9999999999999997 %first not-9 @16th digit

印刷します4.000000000000000。視覚化されるものに基づいての実際の値を知らない人は、asdそれが少なくとも4であると推測しますが、実行中です

asd >= 4

を与える0ので、をfloor(asd)返します3

したがって、Matlabが表示された出力をどのように丸めるかの問題であり、変数に格納されている真の値は4未満です。

アップデート:

18x9のように、数字をさらに進めると、次のようになります。

>> asd = 3.999999999999999999
asd = 
     4
>> asd == 4
ans =
     1

asd正確になります4!(もう表示されないことに注意してください4.000000000000000)しかし、それは別の話です。よりきれいな出力を得るために数値を丸めることではなく、浮動小数点演算がどのように機能するかについてです...実数は特定の相対精度まで表すことができます。この場合、あなたが与えた数は4に非常に近いので、それ自体が4になります。@gokcehanによるコメントに投稿されたPythonリンク、またはここをご覧ください。

于 2012-09-26T22:49:23.220 に答える
1

問題については説明しませんが、代わりに解決策を提供します。single関数を使用します。

B = single(A)は、行列Aを単精度に変換し、その値をBに返します。Aは任意の数値オブジェクト(doubleなど)にすることができます。Aがすでに単精度である場合、singleは効果がありません。単精度の数量は、倍精度の数量よりも必要なストレージが少なくて済みますが、精度が低く、範囲が狭くなります。

これは、この特定の問題を修正することだけを目的としているため、次のようにします。

K>> calc(1,11)

ans =

   4.000000000000000

K>> floor(single(ans))

ans =

 4
于 2015-03-26T01:42:58.800 に答える