Мне приходилось делать это много (я пишу парсеры файлов, и некоторые форматы файлов, такие как NITF, требуют, чтобы вы хранили числовые значения в виде строк).
То, что вы делаете, это эксплойт, основанный на том, какие базовые10 математика (научное обозначение) действительно означает: это означает, что для всех действительных чисел y, y = (x) * 10 ^ (N) для некоторого целого числа N и некоторого x в исключающем диапазоне (-1, 1).
Итак, вы делаете следующее
void PrintScientific(double d)
{
int exponent = (int)floor(log10( fabs(d))); // This will round down the exponent
double base = d * pow(10, -1.0*exponent);
printf("%lfE%+01d", base, exponent);
}
Вы можете добавить все спецификаторы формата, которые вам нужны для управления количеством символов перед, после "."десятичное место.
НЕ забывайте шаг округления!Вот как это работает, используя свойства base10 и logarithms (base 10 здесь):Пусть у = х * 10 ^ N =>log (y) = log (x * 10 ^ N) =>log (y) = log (x) + log (10 ^ N) => // Из журнала "product" rulelog (y) = log (x) + N
Поскольку x находится в диапазоне (-10, 10) - «()» означает исключительный (исключающий), то есть log (x) находится в диапазоне (-1, 1).Поэтому, когда мы округляем число для целочисленного преобразования, мы отбрасываем вклад «log (x)».Затем вы можете получить часть «x» из исходного числа, что позволит вам вывести оригинал в любой научной нотации, которую вы хотите использовать.