Значения Visual C ++ отличаются при печати и отладке?

0

Я проверяю код. Все правильно, но понятие я не могу понять.

double a = 0.001;
double b = 0.001;
double c = a * b;

printf ("%lf", c);

Во время отладки визуального c++, когда я нажимаю курсор на c после третьей строки, он отображает 9.9999999999999955-007, но во время печати отображается правильный результат, то есть 0,000001. Я хочу знать, какое значение он отображает в отладочной подсказке и как она представляет и преобразует.

  • 0
    просто чтобы уточнить ... вы получаете неправильное значение с после 3-й строки?
  • 0
    Нет. На самом деле это точное значение, которое он отображает в научной нотации (9.999999999999995e-007) в подсказке отладки. После печати в printf это правильно, то есть 0.000001. Я хочу знать, как это преобразование и преобразование.
Показать ещё 1 комментарий
Теги:
visual-c++
visual-studio-debugging

2 ответа

3
Лучший ответ

Это результат округления, выполняемого printf.

Формат printf% lf округляет до значения по умолчанию. С вершины моей головы, я думаю, что по умолчанию 6, поэтому вы получаете 0,000001.

Отладчик показывает фактическое содержимое двойника. Из-за характера арифметики с плавающей запятой результат 0,001 * 0,001 на самом деле не 0,000001, а приближение, хотя и с очень небольшой разницей.

Используя другие форматы, вы можете увидеть разницу. Например, попробуйте printf ("%. 15e", c);

  • 0
    Я в мантиссе и показательной форме. Но если вы посмотрите научную запись 0,000001, то это будет 1,0000000000000000e-006, так почему она конвертируется в 9.999999999999995e-007. 0,001 * 0,001 оба являются полностью определенными и будут точными и безупречными результатами 0,000001, так что зачем приближение. Это не так, как я делю 7 на 3.
  • 3
    @BharatSharma IEEE-754 double хранит мантиссу в базе 2, а не в базе 10. Ни 0,001, ни 0,000001 не могут быть точно представлены в базе 2. См. Binaryconvert.com/result_double.html?decimal=048046048048049 и binaryconvert.com/…
Показать ещё 2 комментария
0

Существуют разные реализации для преобразования из double/float в строки и базы, в результате чего вы получите разные результаты. Точная реализация mos, которую я знаю, это std::sringstream и я знаю, что отличается от printf хотя бы на устройствах IOS.

Интерфейс визуальной студии, насколько я знаю, закодирован на С#, поэтому вы можете посмотреть, как С# преобразует двойные строки в строки, чтобы получить ответ, который вы ищете.

Разван.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню