OCaml执行int_of_float -0.7报类型错误的原因及源码位置查询
OCaml
int_of_float/float_of_int调用报错问题解答 报错根因
你遇到的类型错误和两个转换函数的逻辑无关,是OCaml语法解析优先级规则导致的:
- OCaml中函数调用的优先级高于所有中缀运算符,你写的
int_of_float -0.7不会被解析为「把-0.7传入int_of_float」,而是会被解析为(int_of_float) - (0.7),也就是尝试对int_of_float这个函数和浮点数0.7做减法运算 - 减法运算符
-要求两侧都是int类型,但左值是float -> int的函数类型,自然会抛出你看到的类型不匹配报错。你测试的float_of_int -0.7属于完全相同的解析错误。
补充说明:单独执行-0.7;;能正确识别为浮点数,是因为单独的-开头的字面量会被特殊解析为带负号的数值,不会被识别为中缀减法运算符
正确调用写法
给函数传入负数参数时,用以下两种写法均可避免解析错误:
- 给负数参数包裹括号:
int_of_float (-0.7);;,执行后会返回你预期的结果- : int = 0 - 用浮点数专属一元负号运算符:
int_of_float ~-.0.7;;,效果和加括号完全一致
两个转换函数的逻辑与源码位置
这两个都是OCaml标准库的内置基础转换函数:
int_of_float:将输入浮点数向0取整后转换为整数类型,例如输入2.9返回2,输入-0.7返回0,输入-2.9返回-2float_of_int:将输入整数无损转换为对应浮点数,只要输入整数在浮点数的精确表示范围内就不会出现精度损失。
两个函数的源码在OCaml官方仓库的对应路径:
- 接口声明:4.07及更早版本在
stdlib/pervasives.mli,5.0及更新版本在stdlib/stdlib.mli(原Pervasives模块重命名为Stdlib) - 底层实现:对应runtime的C基元函数,实现代码在
runtime/ints.c和runtime/floats.c中,直接调用CPU的原生浮点数转换指令实现,性能极高。
内容的提问来源于stack exchange,提问作者Terunobu Inaba
相关产品推荐
相关产品推荐

