我需要找到一个二次方程的平方根:ax ^ 2 + bx + c = 0。
let h a b c =
if (b*b-4*a*c) < 0 then begin
print_string "There are no real solutions"
end
else if (b*b-4*a*c) = 0 then begin
print_string "The equation has 1 solution x_1=";
print_int ((-b)/(2*a));
end
else begin
float_of_int a;
float_of_int b;
float_of_int c;
print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a));
print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
end;;
为什么这段代码给我语法错误,原因是“此表达式的类型为int,但应为float类型的表达式”:
begin
float_of_int a;
float_of_int b;
float_of_int c;
print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a));
print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
end;;
还有其他更简单的方法来解决此问题吗?
答案 0 :(得分:2)
所以,我编辑了您的问题,因为它不可读,以后请尝试将其格式化;-)
要解决这个问题,这是您的问题:OCaml是一种功能语言,因此当您编写float_of_int a
时,它不会改变a
(您应该警告说该表达式返回了某些内容,但是您不要处理)。 float_of_int
的类型为int -> float
,因此您给它一个整数,并返回一个需要存储在变量中的浮点数。
那么您应该写的是:
begin
let a = float_of_int a in
let b = float_of_int b in
let c = float_of_int c in
print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a));
print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
end;;
侧面说明:我不知道您为什么不将其转换为第二个分支中的浮点数,因为-b/2a
不一定是整数
另外要注意的是,由于您使用了b*b - 4*a*c
四次,因此请将其放在变量的开头:let delta = b*b - 4*a*c in ...