为什么会出现“此表达式的类型为int,但预期为float类型的表达式”错误?

时间:2018-09-30 09:15:34

标签: ocaml

我需要找到一个二次方程的平方根: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;;

还有其他更简单的方法来解决此问题吗?

1 个答案:

答案 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 ...