Проблемы точности с Visual Studio 2010 - PullRequest
4 голосов
/ 15 декабря 2011

У меня есть приложение, написанное на Microsoft Visual C ++ 6.0.Теперь я переписал приложение в Visual Studio 2010 с использованием C #, но результаты не совпадают из-за проблем с точностью.Одной из таких проблем точности является следующая.

float a = 1.0f;

float b = 3.0f;

float c = a / b;

Это код C # при запуске в Visual Studio 2010 дает c значение = 0.333333343

Но тот же код, удаляяf после значения в определении значения при запуске в Visual C ++ 6.0 дает значение c = 0.333333.

Может кто-нибудь разобраться и объяснить, как получить такое же значение для c в Visual Studioкак в Visual C ++ 6.0 ??


Фактически значения берутся из окна просмотра.Я узнал, что разные версии visual studio могут различаться в формате с плавающей запятой.Следовательно, значения в вахте могут быть бесполезны.Это причина, почему я напечатал значения в обеих версиях Visual Studio, и результаты следующие.с Visual Studio 6.0 с использованием языка Visual C ++ это 0,333333 (шесть 3)

, но с Visual Studio 10 с использованием языка C # это 0,3333333 (семь 3)

Так что кто-нибудь может помочь мне сделать мойC # программа для получения того же результата, что и визуальный C ++ ???(т.е. как я могу сделать плавающие операции для получения одинаковых результатов в обеих версиях ???)

Ответы [ 4 ]

15 голосов
/ 15 декабря 2011

Учитывая, что точное значение равно 0,3 повторяющегося, ни одно из них не является "правильным" - и если вы пытаетесь сопоставить точные результаты двоичных вычислений с плавающей запятой, начинать с этого обычно плохая идеяиз-за того, как они работают.(См. Мою статью о двоичной плавающей точке в .NET для получения дополнительной информации.)

* возможно , что вы не должны использовать двоичную плавающую точку в первойместо (например, если ваши значения представляют собой точные, искусственные суммы, такие как деньги).В качестве альтернативы, возможно, вам следует проводить сравнения на равенство только с определенным допуском.

также возможно, что C # и C генерируют точно одинаковую битовую комбинацию - но вы видите разныерезультаты из-за того, как эти значения форматируются .Опять же, я бы не использовал текстовое представление чисел для сравнения.

5 голосов
/ 15 декабря 2011

C# просто отображает меньше десятичных знаков.0.333333343 округлено до шести значащих цифр 0.333333.Базовое значение c одинаково.

Конечно, если вы хотите большей точности, вы всегда можете использовать double переменные.

3 голосов
/ 15 декабря 2011

C # с плавающей запятой может обрабатываться типами float и double.Тип float имеет точность 7 цифр, а double 16.

Я считаю, что стандартная точность C ++ составляет около 16 цифр (в среднем 15,9!).

В любомВ случае, если ни одно из представлений не является арифметически правильным, так как 1/3 является 0,333 повторяющимся.

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

1 голос
/ 15 декабря 2011

Быстрая проверка показывает, что да, цифры точно такие же. Таким образом, ответ на ваш вопрос заключается в том, что когда вы хотите получить одинаковый вывод, все, что вам нужно сделать, это убедиться, что методы отображения совместимы.
Например, printf("%9.7f", result) в C и string.Format("{0:0.0000000}", result) в C #. Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...