Я написал свой ответ в виде сообщения в блоге
Подводя итог некоторым пунктам здесь: вы можете связать strtold()
и strtof()
от OCaml.В первом случае вам придется подумать о том, как вы собираетесь хранить полученный результат, поскольку существует только точка, если long double
больше, чем double
в вашей архитектуре хоста.Остается проблема, заключающаяся в том, что эти функции содержат ошибки в одной из наиболее широко используемых библиотек Си.Очень немного глючит, но глючит именно для тех примеров, которые будут интересны, если вы будете делать это для изучения двойного округления.
Другой способ - написать свою собственную функцию, начиная с другого поста в блоге, на который вы ссылаетесь.
Наконец, фраза «Даже правильное вычисление с плавающей запятой одинарной точности требует от меня синтаксического анализа литералов со значениями больше 64 бит», которые вы используете в комментариях, все еще странный способпоставить это.Промежуточный формат (ы), в котором вы можете анализировать представление с плавающей точкой одинарной точности, прежде чем округлять его до одинарной точности должны быть без потерь, иначе будет двойное округление.Двойное округление может быть более или менее трудным для демонстрации в зависимости от точности промежуточного формата с потерями, но использование 80-битных или 128-битных двоичных форматов с плавающей запятой не решит проблему, просто сделает ее более тонкой.В простом алгоритме, который я рекомендую, промежуточный формат представляет собой дробь двух целочисленных чисел.