Maxima возвращает значение false при сравнении двух одинаковых элементов списка

#maxima #wxmaxima

Вопрос:

Я пытаюсь проверить, совпадает ли приращение от одного числа к следующему от второго к следующему и так далее, но обнаружил, что оно возвращает «ложь», когда должно говорить «истина». Вот что я выяснил после часа возни. Кто-нибудь знает, почему это происходит и можно ли это исправить?

 (%i1) kill(all)$; (%i1) pointsx:[0.1,0.2,0.3,0.4,0.65,0.9]$; (%i2) pointsx[2]-pointsx[1]; pointsx[3]-pointsx[2]; (%o2) 0.1 (%o3) 0.1 (%i4) is(pointsx[2]-pointsx[1]=pointsx[3]-pointsx[2]); (%o4) false (%i5) is(pointsx[2]-pointsx[1]gt;pointsx[3]-pointsx[2]); (%o5) true  

Комментарии:

1. На самом деле это следствие того, как ведут себя числа с плавающей запятой. Когда вы пишете 0.1, 0.2 и т. Д., Maxima представляет те, которые имеют плавающие значения IEEE 754 (широко используемые в языках программирования), и кратные 0.1 не совсем представимы; на самом деле вы получите 0.0999999999999998 или что-то в этом роде. Когда я пытаюсь %o2 - %o3 , я получаю небольшое число, например 2,775 e-17, а не 0. Поиск в Интернете по «удивительному поведению чисел с плавающей запятой», вероятно, найдет некоторые ресурсы.

2. Если важно сравнить числовые значения для равенства, мой совет-использовать рациональные числа, которые в максимумах представлены как 1/10, 2/10, 3/10 и т. Д. Может быть, вы сможете больше рассказать о более масштабной проблеме, которую пытаетесь решить.