Зачем прогуливаться радикс, а strtod нет?

Недавно я работал с входом cin и обнаружил, что strtol нужен основание: long int strtol (const char* str, char** endptr, int base);, но это не так: double strtod (const char* str, char** endptr);, Очевидно, что двойные числа могут быть представлены в других базах, так почему эта дихотомия?

0

Решение

strtol обычно используется с base установлен в 0 или же 10, base==0 заставляет его обрабатывать строку как целочисленную константу C. Он использует ведущий 0 для восьмеричного или ведущего 0x или же 0X для шестнадцатеричной; в противном случае он считается десятичным. С base==10, он не распознает ничего, кроме десятичной (что более удобно для пользователя; большинство пользователей не ожидает ввода 010 быть интерпретированным как 8).

Числа с плавающей точкой могут быть представлены не в десятичной форме, а в C ++, но поддерживает только десятичную. (C добавил поддержку шестнадцатеричной плавающей запятой в стандарте ISO C 1999 года, но C ++ не принял эту функцию.)

strtod мог имели возможность интерпретировать, например, 1.4 в качестве константы base-8, равной 1.5 десятичная дробь — но просто не достаточно спроса, чтобы оправдать это.

Целочисленный ввод может быть с пользой записан в основаниях 2, 8, 10 и 16, и strtol разрешает другие базы только потому, что это легко сделать. Входные данные с плавающей точкой редко являются чем-то иным, кроме десятичного (и синтаксис шестнадцатеричной константы с плавающей точкой C является однозначным, поэтому нет необходимости указывать его)

2

Другие решения

Причина этого в том, что в C ++ нет способа выразить значение с плавающей запятой в другой базе, отличной от базы 10. Из [lex.fcon] 2.13.4 (1)

Плавающий литерал состоит из целочисленной части, десятичной точки, дробной части, e или E, необязательного целого показателя со знаком и необязательного суффикса типа. Целые и дробные части состоят из последовательности десятичные (основание десять) цифр. […]

акцент мой

Если числа с плавающей точкой могут быть выражены только в базе 10, то нет необходимости указывать базу. целочисленные типы, с другой стороны, могут быть выражены в разных strtol имеет дело с этим.

2

По вопросам рекламы [email protected]