Задать вопрос
@mIka01

Как умножать без периода в c#?

Здраствуйте столкнулся с весьма простой загвоздкой необходимо подтвердить правильность теоремы Пифагора. Выполнил и во время выполнения юнит тестов выяснилось ошибка.

Предварительно массив отсортирован по убыванию
MathF.Pow(abc[0], 2) == MathF.Pow(abc[1], 2) + MathF.Pow(abc[2], 2)


Для чисел 3.5f, 2.8f, 2.1f проверка не проходит.
Стал выяснять и понял, что оказывается c# умножая 2.8 получает не 7.84, а 7.839(в периоде).

Вопрос как сделать правильное умножение?
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
По сути никак.
У тебя в любом случае будет возникать период. Если не из-за двоичных чисел, то из-за десятичных. + всегда будет ограничение по точности для очень длинных чисел.

Варианты, как преодолеть:
1. Округлять до N значимых.
2. Сравнивать на равенство через разность
3. Использовать decimal (не панацея) или BigDecimal (нужно поискать библиотеку)
4. Использовать библиотеки для символьной математики. (Гугли symbolic math)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Писать свою точную арифметику или использовать какую-то готовую библиотеку. Стандартные вычисления завязаны на машинное представление чисел и имеют ограниченную точность.
2.810 = 10.(1100)2
То есть, число 2.8 в двоичном представлении является бесконечной дробью и не может быть точно представлено конечным числом битов.
А вообще, использовать такие вычисления для доказательства теорем бессмысленно, поскольку существует бесконечное количество троек чисел и вы не успеете проверить их все до наступления тепловой смерти вселенной.
Ответ написан
Комментировать
vaut
@vaut
Числа с плавающей точкой нельзя сравнивать на равенство в любом я языке программирования.
Вычисления с плавающей точкой приближенные, это фундаментальное поведение процессоров.
Ответ написан
Комментировать
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Типичный новичок в программировании, который не знает что такое числа с плавающей точкой
Вот, читай и учись
https://0.30000000000000004.com/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы