Святое домашнее задание, бэтмен! :)
Что делает это интересным, так это то, что вы не можете просто выполнить цикл (atof | strtod | sscanf) -> sprintf и проверить, вернули ли вы исходную строку. sprintf на многих платформах обнаруживает двойное «как можно ближе к 0,1» и печатает его, например, как 0,1, даже если 0,1 точно не представляется.
#include <stdio.h>
int main() {
printf("%llx = %f\n",0.1,0.1);
}
печатает:
3fb999999999999a = 0,100000
в моей системе.
Реальный ответ, вероятно, потребовал бы анализа двойного числа, чтобы преобразовать его в точное дробное представление (0,1 = 1/10), а затем убедившись, что времена преобразования atof в знаменатель равны числителю.
Я думаю.