Может быть, это не относится к SO, но я не знаю, где еще.
Мне нужно переопределить printf(3)
с помощью C
без использования какой-либо функции, которая будет делать преобразование для меня, я почти готов, но я застрял на %a
, я действительно не понимаю, что такое например, здесь:
printf("%a\n", 3.0); //#=> 0x1.8p+1
printf("%a\n", 3.1); //#=> 0x1.8cccccccccccdp+1
printf("%a\n", 3.2); //#=> 0x1.999999999999ap+1
printf("%a\n", 3.3); //#=> 0x1.a666666666666p+1
printf("%a\n", 3.4); //#=> 0x1.b333333333333p+1
printf("%a\n", 3.5); //#=> 0x1.cp+1
printf("%a\n", 3.6); //#=> 0x1.ccccccccccccdp+1
Конечно, я читаю человека, который говорит:
Двойной аргумент округляется и преобразуется в шестнадцатеричную нотацию в стиле [-] 0xh.hhhp [+ -] d, где число цифр после символ шестнадцатеричной точки равен спецификации точности.
Но это действительно не помогает, я не понимаю процесс, который преобразует 3.2
в 1.999999999999ap+1
Мне не нужен какой-либо код, но действительно более объяснение.
PS: Если это не место для этого вопроса, можете ли вы указать мне нужное место?
EDIT: пока @juhist
ответ работает для чисел >= 1.0
, он не объясняет, как получить результат для чисел между 0.0
et 1.0
:
printf("%a\n", 0.01); //#=> 0x1.47ae147ae147bp-7
printf("%a\n", 0.1); //#=> 0x1.999999999999ap-4
printf("%a\n", 0.2); //#=> 0x1.999999999999ap-3
printf("%a\n", 0.3); //#=> 0x1.3333333333333p-2
printf("%a\n", 0.4); //#=> 0x1.999999999999ap-2
printf("%a\n", 0.5); //#=> 0x1p-1
printf("%a\n", 0.6); //#=> 0x1.3333333333333p-1
Также мне бы очень хотелось получить точность этого The "a" near the end occurs due to limited floating point calculation precision
относительно преобразования: printf("%a\n", 3.2); //#=> 0x1.999999999999ap+1
EDIT2: Теперь последняя загадка объясняет, почему в этом случае:
printf("%a\n", 0.1); //#=> 0x1.999999999999ap-4
Последний 9
становится и a
, и в этом случае:
printf("%a\n", 0.3); //#=> 0x1.3333333333333p-2
В последнем 3
остается a 3
?