https://kotlinlang.org logo
Title
д

Дмитрий Силюк

10/21/2020, 12:00 PM
Добрый день, нужна ваша консультация. Решаю задачу:
* Для заданного x рассчитать с заданной точностью eps
 * sin(x) = x - x^3 / 3! + x^5 / 5! - x^7 / 7! + ...
 * Нужную точность считать достигнутой, если очередной член ряда меньше eps по модулю
 */
Вроде бы работает, но в ходе тестов не проходит последний в котором x=100*PI
@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

Marat Akhin

10/21/2020, 2:32 PM
Для относительно больших значений x возведение в степень с какого-то момента становится вычислительно нестабильным. Чтобы справиться с проблемой, подумайте, нет ли у функции sin свойства, которое бы позволило перейти к меньшему значению x? PS: и уберите из сообщения код, пожалуйста, иначе идущие за вами будут соблазняться готовым решением )))
д

Дмитрий Силюк

10/22/2020, 6:34 AM
👍 ну да логично... что-то я затупил. Все заработало)