Максимум CAS: поплавок заменен - PullRequest
1 голос
/ 05 июня 2011

в Максимах я делаю:

(%i1) 1.4*28;

(%o1) 39.2

(%i2) is(1.4*28=39.2);

(%o2) false

Это странно для меня, но, вероятно, связано с заменой крыс?

Есть ли способ, чтобы максимумы возвращали "true"вход is(1.4*28=39.2);?

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Так как «обычные» калькуляторы могут неправильно ответить на такие вопросы, иногда неясно, что действительно решит вашу проблему.Если вы настраиваете автоматический арифметический тест, чтобы увидеть, могут ли люди получить правильный ответ, то, возможно, вам следует проверить, согласен ли он до некоторой терпимости.

(примеры для вашего калькулятора можно построить, рассчитав вариации 1,0 / 3,0, а затем умножив на 3. Вы можете получить 0,9999 .... Некоторые калькуляторы округляются лучше, чем другие, поэтому примеры должны быть немного более тонкимиКак 1.0 / 30.0 X 30.0)

Возвращаясь к Maxima, вы можете проверить, есть ли abs (ab) <допуск или, возможно, abs ((ab) / max (a, b)) <относительная толерантность.</p>

Теперь, если то, что действительно решило бы вашу проблему, это просто меньшая точность в OUTPUT, вы можете просто установить fpprintprec: 5, чтобы получить 5 десятичных цифр (округлено).

Альтернативой является чтение ваших чиселтак что 3.1 фактически никогда не преобразуется в двоичный файл, но первоначально анализируется как 3 + 1/10.С этого момента вся рациональная арифметика может быть выполнена точно.(Рациональная арифметика не включает в себя квадратные корни, логарифмы, косинус ..., просто + - * / и целые числа).Сейчас это не часть Maxima.

Кстати, ваш пример 0.1 + 0.2 отображается как 0.3 на дисплее wxmaxima.Но это скрывает фактическое значение, потому что% -3 / 10 на самом деле не ноль.игра с fpprec: 50;мы можем представить 0.3, все еще в двоичном виде, но намного больше цифр, набрав 0.3b0.

0.1 + 0.2-0.3b0;дает 4.440892098500626161694526672363281263363823550461b-17

ой, если вас беспокоят сообщения о том, что Maxima преобразует числа с плавающей точкой в ​​рациональные числа, установите ratprint: false.Это не меняет вычисления, только предупреждения.

3 голосов
/ 13 июня 2011

С Гид с плавающей точкой :

Почему мои цифры, такие как 0,1 + 0,2, не складываются в хороший раунд 0,3, и вместо этого я получаю странный результат, как +0,30000000000000004

Потому что внутренне компьютеры используют формат (двоичная с плавающей точкой), что не может точно представить число например, 0,1, 0,2 или 0,3.

Когда код скомпилирован или интерпретируется, ваш «0,1» уже округляется до ближайшего числа в этом формат, в результате чего небольшой ошибка округления еще до расчет происходит.

В вашем случае и 1.4, и 39.2 не могут быть точно представлены в виде двоичной дроби, и результат вычисления заканчивается округлением не так, как буквально 39.2.

Если вы хотите избежать подобных проблем, вам следует избегать использования двоичных чисел с плавающей запятой. Я думаю, что в Maxima это проще всего сделать, используя правильные дроби:

is(14/10 * 28 = 392/10)

должно работать

...