Почему я получаю сообщение об ошибке «Это выражение имеет тип int, но ожидалось выражение типа float»? - PullRequest
0 голосов
/ 30 сентября 2018

Мне нужно найти квадратные корни квадратного уравнения: 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 голосов
/ 30 сентября 2018

Итак, я отредактировал ваш вопрос, потому что он был нечитабельным, попробуйте отформатировать его так в будущем; -)

Ответ: вот ваша проблема: 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 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...