Я проверяю код. Все правильно, но понятие я не могу понять.
double a = 0.001;
double b = 0.001;
double c = a * b;
printf ("%lf", c);
Во время отладки визуального c++, когда я нажимаю курсор на c после третьей строки, он отображает 9.9999999999999955-007, но во время печати отображается правильный результат, то есть 0,000001. Я хочу знать, какое значение он отображает в отладочной подсказке и как она представляет и преобразует.
Это результат округления, выполняемого printf.
Формат printf% lf округляет до значения по умолчанию. С вершины моей головы, я думаю, что по умолчанию 6, поэтому вы получаете 0,000001.
Отладчик показывает фактическое содержимое двойника. Из-за характера арифметики с плавающей запятой результат 0,001 * 0,001 на самом деле не 0,000001, а приближение, хотя и с очень небольшой разницей.
Используя другие форматы, вы можете увидеть разницу. Например, попробуйте printf ("%. 15e", c);
double
хранит мантиссу в базе 2, а не в базе 10. Ни 0,001, ни 0,000001 не могут быть точно представлены в базе 2. См. Binaryconvert.com/result_double.html?decimal=048046048048049 и binaryconvert.com/…
Существуют разные реализации для преобразования из double/float в строки и базы, в результате чего вы получите разные результаты. Точная реализация mos, которую я знаю, это std::sringstream
и я знаю, что отличается от printf
хотя бы на устройствах IOS.
Интерфейс визуальной студии, насколько я знаю, закодирован на С#, поэтому вы можете посмотреть, как С# преобразует двойные строки в строки, чтобы получить ответ, который вы ищете.
Разван.