Ошибка при использовании питания в Delphi

#delphi

#delphi

Вопрос:

В моей программе есть следующая функция, и она выдает мне значение EInvalidOp (недопустимая операция с плавающей запятой):

 function TMyProgram.GetVal(A, B, C, D, E: double): double;

begin

  Result := A/Power((C - D)/(D - B), 1/E);

end;
  

Значения параметров:

A: 320.068, B: 84.46, C: 91.632, D: 24.15, E: 11

Excel выдает мне результат -316.815, но Delphi выдает мне ошибку при выполнении этой функции.

Комментарии:

1. Интересно. В документах говорится: «для дробных показателей база должна быть больше 0». Интересно, почему.

2. Я полагаю, это потребовало бы перехода к комплексным числам (например, -1 ^ 0,5 — это квадратный корень из -1, который на самом деле является мнимым числом), поэтому я понимаю, что говорят «документы», но мне интересно, как Excel решает эту проблему.

3. Excel выполняет абсолютное значение для базы, а затем отрицает результат. Ряд онлайн-калькуляторов делают то же самое.

4. Вы должны решить, какой ответ вы хотите. Что вы хотите, чтобы это вычисление вернуло? Возможно, исключение является правильным.

5. @DavidHeffernan Есть некоторая поддержка, связанная с вариантами — docwiki.embarcadero.com/Libraries/XE6/en/System.VarCmplx . Существует также образец с немного более удобной настройкой, но я предполагаю, что если это образец, он не поддерживается: docwiki.embarcadero.com/CodeExamples/XE6/en /.

Ответ №1:

Я провел еще немного исследований. Проблема заключается в повышении отрицательной базы до дробного показателя. В вашем конкретном случае вы можете использовать математическую идентификацию, чтобы обойти ее, выполнив следующее:

 function TMyProgram.GetVal(A, B, C, D: Double; E: Integer): double;
begin
  if Odd(E) and ((C - D)/(D - B) < 0) then
    Result := A/-Power(Abs((C - D)/(D - B)), 1/E)
  else
    Result := A/Power((C - D)/(D - B), 1/E);
end;
  

Это работает только тогда, когда E является нечетным числом.

Комментарии:

1. Если else с четным (E) вызывает исключение, для чего это «else» тогда хорошо?

2. Он вычисляет другие параметры. Например, где (C - D)/(D - B) > 0. В случае, когда в блоке else есть исключение, мы мало что можем сделать, поскольку результатом в этом случае является комплексное число.

3. если E = 11, то я получаю то же число -316.81520613 . Но, возможно, я что-то неправильно понял. Если я протестирую с E = 8 или 10 или 12. Я получаю invalid Floating Point Operation .

4. @moskito-x Если я возьму -3 ^ 3, это даст мне -27. Кубический корень из -27 равен -3. Это то же самое, что сказать -27 ^ 1/3 =-3. Поскольку число нечетное, мы можем «переместить» отрицательное значение наружу и записать его следующим образом -(Abs (-27) ^ 1/3). Это работает только тогда, когда мы имеем дело с нечетными числами, потому что, например, квадратный корень из -4 не равен -2, это комплексное число.

5. С power2 и четное число =12. Я получаю -317.08500501 без исключения. Извините, что я требую такого невежества, но почему это так?

Ответ №2:

-316.81520613

Вот что я получаю с помощью функции power2 от Джека Лайла.

посмотрите здесь полный код power2

{** Функция power от Джека Лайла. Говорят, что он более мощный, чем функция Pow, которая поставляется с Delphi. }

 function Power2(Base, Exponent : Double) : Double;
{ raises the base to the exponent }
  CONST
    cTiny = 1e-15;

  VAR
    Power : Double; { Value before sign correction }

  BEGIN
    Power := 0;
    { Deal with the near zero special cases }
    IF (Abs(Base) < cTiny) THEN BEGIN
      Base := 0.0;
    END; { IF }
    ... // see the link to full code

  END; { FUNCTION Pow }
  

Комментарии:

1. Просто предупреждение, эта функция выдает неверное значение для Power2 (-1.5, 0.5), которое является квадратным корнем из -1.5.

2. @Graymatter : посмотрите на предупреждение в нижней части статьи. Не используйте простую функцию power, если вы ожидаете когда-либо увидеть отрицательную базу в качестве входных данных.

3. Насколько я понял, это предупреждение касается встроенной функции power, а не с предоставленным кодом.

4. Я считаю, что правильным ответом должно быть комплексное число.

5. @moskito-x Вы должны прочитать это en.wikipedia.org/wiki /…