Наверно проще всего убрать погрешность не конвертируя строку в число. Числа с плавающей точкой на самом деле не произвольное действительное число погут представить, а только ограниченное подмножество оных. Или тебе принципиально с ним именно как с числом работать?
Принципиально. Я потом использую эту частоту, чтобы измерять маленькие интервалы времени с помощью rdtsc().
Да, похоже, число 3014.200 просто не входит в список значений float. Сделал обычную float константу с таким значением, в результате printf показал всё те же 3014.199951 .
Как вариант вместо float сделал переменную double, получилось 3014.199999999999818101 , точно до 12-го знака после запятой, т.е. всего 16 значащих цифр, вроде как это максимум для double, дальшя я, наверно, уже вышел за область памяти переменной. Такой точности в рассчётах хватит, я думаю

(хотя если в dmesg выдаётся только три знака после, то делать переменную точнее float смысла нет)
PS тут ещё подумалось, может есть способ получить частоту с большей точностью, чем в dmesg?