ОК, некоторые ответы.Предположим, ради аргумента, что это наиболее распространенное определение double, а именно 64-битный стандарт IEE 754.
Благодаря тому, как эти вещи работают, можно выразить значениепеременной двойной точности точно в десятичной.Например, вы можете хранить 2 ^ 200 в одном, и вы сможете записать это точно в виде десятичного числа с 61 цифрой.Никто никогда не делает этого, но, поверьте мне, это возможно.
Когда ухудшение наступает, когда вы пытаетесь хранить вещи в двойном формате, который не может быть выражен точно в его формате, например 1/7.Ближайшим приближением является число, начинающееся с 16 правильных цифр после десятичной точки, но если вы считаете, что остальные цифры не имеют значения, вы ошибаетесь.Запись в файл только этих 16 цифр (т. Е. Число .1428571428571428) и последующее чтение его приведут к немного другому значению, чем у вас было раньше, что отличается от 1/7.
Так что да, если вы должны записать номер в файл и прочитать его обратно, не делайте так.Если вы не можете просто записать «родной» байтовый контент в двоичный файл, допустимым вариантом является использование 16 шестнадцатеричных цифр.
Вот, пожалуйста.Если мы снова предположим, что double равен 8 байтам, вам не понадобится буфер переменной длины и без цикла.
string double_to_hex_string(double d)
{
char converted[17];
sprintf(converted, "%016llX", *((uint64_t*)&d));
return std::string(converted);
}
Кстати,
Doubleзначение 0,61 представляется в памяти как 0,60999 (повторное возникновение).
не совсем корректно, повторяются только 14 девяток.(После этого есть другие цифры.) Если бы было бесконечное число девяток, это было бы точное представление 0,61!
Остальные ваши предположения в порядке.