Поддерживает ли компилятор любой из ecvt
, fcvt
или gcvt
? Они немного причудливы и сложны в использовании, но у них есть свой собственный буфер (ecvt
, fcvt
), и / или вам может повезти и вы обнаружите, что системные заголовки имеют, как в VC ++, определение максимального числа из gcvt
будет производить. И вы можете взять его оттуда.
Если это не удастся, я бы посчитал следующее вполне приемлемым в соответствии с приведенным кодом. 500 символов довольно консервативны для двойника; допустимые значения примерно от 10 ^ -308 до 10 ^ 308, поэтому даже если реализация определена как раздражающая при распечатке всех цифр, переполнения быть не должно.
char *fmt_double(double d) {
static char buf[500];
sprintf(buf,"%f",d);
assert(buf[sizeof buf-1]==0);//if this fails, increase buffer size!
return strdup(buf);
}
Это не дает никаких удивительных гарантий, но должно быть довольно безопасно (тм). Я думаю, что это так же хорошо, как это происходит с таким подходом, к сожалению. Но если у вас есть привычка регулярно запускать отладочные сборки, вы должны по крайней мере получать раннее предупреждение о любых проблемах ...