Добрый день, нужна ваша консультация. Решаю задачу...
# russian-kotlinasfirst
д
Добрый день, нужна ваша консультация. Решаю задачу:
Copy code
* Для заданного x рассчитать с заданной точностью eps
 * sin(x) = x - x^3 / 3! + x^5 / 5! - x^7 / 7! + ...
 * Нужную точность считать достигнутой, если очередной член ряда меньше eps по модулю
 */
Вроде бы работает, но в ходе тестов не проходит последний в котором x=100*PI
Copy code
@Test
@Tag("Normal")
fun sin() {
    assertEquals(0.0, sin(0.0, 1e-5), 1e-5)
    assertEquals(1.0, sin(PI / 2.0, 1e-5), 1e-5)
    assertEquals(0.0, sin(PI, 1e-5), 1e-5)
    assertEquals(-1.0, sin(3.0 * PI / 2.0, 1e-5), 1e-5)
    assertEquals(0.0, sin(100.0 * PI, 1e-5), 1e-5)
}
При расчетах получаются слишком большие числа в итоге результат выходит NaN.
m
Для относительно больших значений x возведение в степень с какого-то момента становится вычислительно нестабильным. Чтобы справиться с проблемой, подумайте, нет ли у функции sin свойства, которое бы позволило перейти к меньшему значению x? PS: и уберите из сообщения код, пожалуйста, иначе идущие за вами будут соблазняться готовым решением )))
д
👍 ну да логично... что-то я затупил. Все заработало)