qSin () дает неправильные значения греха?

У меня есть код:

for(int i = 0; i < 314; i++){
float nextSine = aSin(i/5);
qDebug() << "i: "<<QString::number(i)<<" sin(i/5) = nextSine: "<<nextSine;
}

И вот пример результатов, которые я получаю:

i:  "303"  sin(i/5) = nextSine:  -0.304811
i:  "304"  sin(i/5) = nextSine:  -0.304811
i:  "305"  sin(i/5) = nextSine:  -0.966118
i:  "306"  sin(i/5) = nextSine:  -0.966118

Иногда это правильно, но иногда неправильно, например, когда i==303

2

Решение

Вы, вероятно, хотите привести в плавающее состояние перед запуском функции:

float nextSine = aSin((float)i/5.0);
2

Другие решения

У вас есть эти проблемы, продолжающиеся здесь:

1) Вы пытаетесь разделить целое число на 5, что может привести к потере точности, если целое число не делится на 5. Например, 313/5 = 62, а не 62,6 в вашем случае, но это только один из примеров. Решение состоит в том, чтобы использовать float явно.

2) У вас есть ненужная переменная nextSine. Вы можете просто устранить это здесь.

3) В вашем коде есть синтаксическая ошибка, так как вы имели в виду ** q ** Sin, а не aSin.

4) Удостоверьтесь, что вы выполняете свою функцию как можно более эффективно.

5) Вы пытаетесь использовать явное пространство для печати, но qDebug уже управляет этим для вас, так что в итоге вы получите два вместо намеченного.

Итак, вот что я бы лично написал:

for (int i = 0; i < 314; ++i)
qDebug() << "i:" <<QString::number(i)
<< " sin(i/5) = nextSine:" << qSin(static_cast<float>(i)/5);

или же

for (int i = 0; i < 314; ++i)
qDebug() << "i:" <<QString::number(i)
<< " sin(i/5.0) = nextSine:" << qSin(i/5.0);

или же

for (float f = 0; f < 314.0; f+=1.0)
qDebug() << "i:" <<QString::number(f, 'f')
<< " sin(f/5) = nextSine:" << qSin(f/5);
1

По вопросам рекламы [email protected]