Я пытаюсь сравнить массив двойников со скалярным двойником на равенство, но равенство никогда не признается при определенных обстоятельствах.Я подозреваю, что это связано со способом представления двойного (например, 1,0 против 1,00), но я не могу понять это.
Например, я сгенерировал массив, состоящий из тысяч двойныхзначения, последние несколько из которых в какой-то момент времени задаются как
10.6000
-11.0000
10.2000
22.6000
3.4000
Если я проверяю равенство 10,2 (или 10,2000) командой array==10.2
(или array=10.2000
), я возвращаюмассив 0s.Если я помещаю значения, показанные в массив вручную (например, array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
), то команда выполняется успешно (то есть, array==10.2
возвращает 0 0 1 0 0
).Может кто-нибудь объяснить, почему равенство удается, если я ввожу значения вручную, но не получается, если массив генерируется в контексте программы?Я могу исправить ошибку сравнения, используя приблизительное, а не точное сравнение (например, (array<10.20001) & (array>10.19999)
), но это кажется неудовлетворительным.
Редактировать: значения в массиве генерируются путем итеративного сложения или вычитанияпостоянного двойного (например, 0.2
).Поэтому модуль этого массива на 0.2
должен быть везде равен 0
.Фактически, модуль каждого элемента равен либо 0
, либо 0.2
, как показано ниже для приведенной выше последовательности чисел в массиве:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
Опять же, если значения помещены вмассив вручную и модуль взят, ожидаемое значение всех 0
с.