Я не могу понять, почему появляется NaN
И ответ на ваш вопрос:
, потому что аргумент немного больше чем 1
Правильный вопрос будет в этом случае:
Как мне убедиться, что аргумент acos
не больше 1?
Для этого вам нужно проанализировать свою формулу и посмотреть, откуда возникла проблема. Возможно, что sqrt
и разделение играют роль.
Самый простой способ взлома (может быть плохим для вашего приложения) - сначала проверить, является ли аргумент больше 1, и, если да, усечь его. 1.
Обратите внимание, что вы теряете дополнительную точность вычисления rn
, gn
, bn
. Аргумент sqrt
может быть лучше рассчитан как:
a = (r-g)*(r-g)+(r-b)*(g-b);
b = (r+g+b)*(r+g+b);
argument = a/b;
Поиграйте с ним и посмотрите, что произойдет.
Кроме того, последовательность
// issue with the argument of acos being just slightly bigger than 1. Approximate to 0
if (isnan(h)) {
h = 0;
}
следует использовать перед вызовом acos
и с использованием (предварительно рассчитанного) аргумента acos
вместо вычисленного h
.