Почему c # принимает неточность, используя плавающие точки для хранения данных?
«C #» не допускает компромисса между производительностью и точностью;пользователи принимают или не соглашаются с этим.
C # имеет три типа с плавающей запятой - с плавающей запятой, с двойным и десятичным - потому что эти три типа отвечают подавляющему большинству потребностей реальных программистов.
float и double хороши для «научных» вычислений, где ответ, правильный для трех или четырех десятичных знаков, всегда достаточно близок, потому что это точность, с которой исходное измерение пришло.Предположим, что вы разделите 10,00 на 3 и получите 3.333333333333.Поскольку исходное измерение, вероятно, было точным только до 0,01, тот факт, что вычисленный результат отклоняется менее чем на 0,0000000000004, не имеет значения.В научных расчетах вы не представляете известные точные величины. Неточность в пятнадцатом десятичном знаке не имеет значения, если исходное значение измерения было точным только до второго десятичного знака .
Это, конечно, неверно для финансовых расчетов.Операнды для финансового расчета обычно являются точными с точностью до двух десятичных знаков и представляют точные величины .Десятичная дробь хороша для «финансовых» вычислений, потому что результаты десятичной операции точны при условии, что все входы и выходы могут быть представлены точно как десятичные дроби (и все они находятся в разумном диапазоне).Конечно, десятичные дроби по-прежнему имеют ошибки округления, но точные операции - это именно те операции, которые вы, вероятно, захотите быть точными при выполнении финансовых расчетов.
И в чем преимущество его использования по сравнению с другимиметоды?
Вы должны указать, с какими другими методами вы хотели бы сравнить.Существует множество различных методов выполнения вычислений на компьютерах.
Например, Math.Pow (Math.Sqrt (2), 2) не является точным в c #.Существуют языки программирования, которые могут его точно вычислить (например, Mathematica).
Давайте проясним этот момент;Mathematica не "точно вычисляет" корень 2;число нерационально, поэтому оно не может быть точно рассчитано при любом конечном объеме памяти.Вместо этого Mathematica представляет числа как объекты, которые описывают, как было создано число.Если вы говорите «дай мне квадратный корень из двух», то Mathematica по существу выделяет объект, который означает «применение оператора квадратного корня к точному числу 2».Если вы затем возводите это в квадрат, у него есть логика специального назначения, которая гласит: «Если вы возводите в квадрат что-то, что было квадратным корнем чего-то другого, верните первоначальное значение».Mathematica имеет объекты, которые также представляют различные специальные числа, такие как pi или e, и огромное количество правил для того, как различные манипуляции с этими числами объединяются.
По сути, это символическая система;он манипулирует числами так же, как люди, когда делают математику с карандашом и бумагой.Большинство компьютерных программ манипулируют числами, как калькулятор: выполняйте вычисления немедленно и округляйте их.Если это неприемлемо, тогда вам следует придерживаться символической системы.
Один из аргументов, который я могу придумать, заключается в том, что его вычисление точно намного медленнее, чем простое преодоление неточностей, но Mathematica и Matlabиспользуется для вычисления гигантских научных задач, поэтому мне трудно поверить, что эти языки действительно значительно медленнее, чем c #.
Дело не в том, что они медленнее, хотя умножение чисел с плавающей запятой действительно невероятно быстросовременное оборудование.Дело в том, что механизм символьных вычислений чрезвычайно сложен .Он кодирует все правила базовой математики , и таких правил много!C # не предназначен для того, чтобы быть средством символьных вычислений профессионального уровня, он предназначен для языка программирования общего назначения.