IEEE 64 и 32-битная проверка с плавающей запятой в OCaml
У меня есть строка, соответствующая следующему регулярному выражению \-?[0-9]*\.[0-9]+
который предположительно представляет число IEEE с плавающей запятой. Это может быть одинарная или двойная точность, и я знаю тип заранее. Мне нужно проверить, может ли это быть истолковано как действительное значение в данной предварительной оценке. Что-то вроде:
val is_valid_float: string -> bool
val is_valid_double: string -> bool
Для чисел двойной точности, я могу просто разобрать его, используя float_of_string
и поймать исключение. Я не уверен, как справиться с одинарной точностью.
1 ответ
Комментарии @JonathanChan поучительны, вероятно, больше, чем все, что я мог бы сказать.
Однако я даже не уверен, что вы подразумеваете под проверкой.
Является ли "1.0000000000000001" допустимым числом с плавающей точкой?
val f : string = "1.0000000000000001"
# float_of_string f;;
- : float = 1.
#
Нет никаких исключений, чтобы указать, что это число не может быть представлено как отличное от 1.0.
Если вы игнорируете проблемы точности, может быть нетрудно проверить соответствие представляемому диапазону просто как строковую операцию.
Как указывает @JonathanChan, лучший ответ, вероятно, зависит от того, насколько вы должны быть уверены (и в чем именно вы хотите быть уверены).