карта (NaN), которая возвращает NaN, но я не могу отладить для NaN - PullRequest
1 голос
/ 30 октября 2019

Я включил фрагмент, который демонстрирует мою проблему. По сути, обработка дает мне эту ошибку:

map(NaN, -3, 3, -125, 125) called, which returns NaN (not a number)

Я понимаю это сообщение так, что функция map возвращает NaN, и, поскольку она возвращает float, я должен быть в состоянии проверить с помощью Float. NaN. Однако, как было показано, я не получаю ни одного удара при создании оператора if, который его проверяет. Я попытался поместить оператор if перед функцией map с соответствующими переменными, но без совпадений. Мне было интересно, может ли кто-нибудь объяснить мне это явление и помочь мне с отладкой кода. Это, вероятно, небольшая вещь, которую я наблюдаю, но это сводит меня с ума. Заранее спасибо

Фрагмент:

void setup() {
  size(500, 500);
}

void draw() {
  background(0);
}

class Complex {
  private float re, im, r, p;

  Complex(float real, float imag) {
    re = real;
    im = imag;
    r = sqrt(sq(re)+sq(im)); //radius 
    p = atan2(im, re);       //phase
  }

  Complex Div(Complex b) {
    Complex a = this;
    float real = (a.re*b.re+a.im*b.im)/(sq(b.re)+sq(b.im));
    float imag = (a.im*b.re-a.re*b.im)/(sq(b.re)+sq(b.im));
    return new Complex(real, imag);
  }

  Complex Ln() {
    float real = log(r);
    float imag = p;
    return new Complex(real, imag);
  }

  Complex LogBase(Complex b) {
    Complex a = this;
    return a.Ln().Div(b.Ln());
  }

  Complex Scale(float scale, int dim) {
    float real = map(re, -scale, scale, -dim, dim);
    float imag = map(im, -scale, scale, -dim, dim);
    if (real == Float.NaN || imag == Float.NaN) {
      print("\nHit!");
    }
    return new Complex(real, imag);
  }
}

void keyPressed() {
  float d = width/4;
  for (float z = -d; z<d; z++) {
    for (float x = -d; x<d; x++) {
      Complex c = new Complex(1, 5);
      c = c.LogBase(new Complex(x, z));
      c.Scale(3.0, int(d));
    }
  }
}

1 Ответ

1 голос
/ 30 октября 2019

Похоже, что недоразумение связано с сравнением с NaN. Любое сравнение эквивалентности (==) с NaN вернет false. Это имеет место даже при сравнении с самим собой. Чтобы проверить значение NaN, вы можете использовать метод Float.isNaN.

Так, например,

    System.out.println("(Float.NaN == Float.NaN) -> " + (Float.NaN == Float.NaN));
    System.out.println("(Float.isNaN(Float.NaN)) -> " + (Float.isNaN(Float.NaN)));

производит:

(Float.NaN == Float.NaN) -> false
(Float.isNaN(Float.NaN)) -> true
...