From 55fd3ea7160d59f937681d3b356d7e928480fdfe Mon Sep 17 00:00:00 2001 From: sergeych Date: Wed, 11 Jun 2025 14:06:19 +0400 Subject: [PATCH] more docs --- docs/samples/сумма_ряда.lyng.md | 17 +++++++++++++++ library/src/commonTest/kotlin/ScriptTest.kt | 23 --------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/docs/samples/сумма_ряда.lyng.md b/docs/samples/сумма_ряда.lyng.md index 47768b1..b270005 100644 --- a/docs/samples/сумма_ряда.lyng.md +++ b/docs/samples/сумма_ряда.lyng.md @@ -31,6 +31,23 @@ $$ \ln(1+x)=x-{\dfrac {x^{2}}{2}}+{\dfrac {x^{3}}{3}}-\cdots =\sum \limits _{n=0 assert( x - ln(2) < 0.001 ) +В нашем примере есть изъян - погрешность вычисляется примитивно: `abs(следующая_сумма - сумма) < погрешность`, что совершенно неверно, если значения малы. Значительно более корректно вычислять погрешность, нормированную на диапазон сравниваемых величин: + + + fun погрешность(x0, x1) { + abs( x1 - x0 ) / (abs( x1 + x0 ) / 2.0) + } + // относительная погрешность одинакова и в разных диапазонах + assertEquals( погрешность(5,6), погрешность(0.005,0.006)) + +Теперь мы могли бы написать более корректное сравнение для вещественных + + // расхождение не больше 1% или сколько укажете: + fun почти_равны(a,b,epsilon=0.01) { + погрешность(a,b) <= epsilon + } + assert( почти_равны( 0.0005, 0.000501 ) ) + Во многих случаях вычисление $n+1$ члена значительно проще cчитается от предыдущего члена, в нашем случае это можно было бы записать через итератор, что мы вскоре добавим. (продолжение следует) diff --git a/library/src/commonTest/kotlin/ScriptTest.kt b/library/src/commonTest/kotlin/ScriptTest.kt index 9f851cd..b306bf3 100644 --- a/library/src/commonTest/kotlin/ScriptTest.kt +++ b/library/src/commonTest/kotlin/ScriptTest.kt @@ -1661,28 +1661,5 @@ class ScriptTest { assert( x - ln(2) < 0.001 ) """.trimIndent()) } -// -// @Test -// fun customIteratorTest() = runTest { -// eval(""" -// fun сумма_ряда2(погрешность=0.0001, iterator) { -// var сумма = 0 -// for( n in 1..100000) { -// if( !iterator.hasNext() ) break сумма -// val следующая_сумма = сумма + iterator.next() -// if( n > 1 && abs(следующая_сумма - сумма) < погрешность ) -// break следующая_сумма -// сумма = следующая_сумма -// } -// else null -// } -// val -// val x = сумма_ряда2(1) { x, n -> -// val sign = if( n % 2 == 1 ) 1 else -1 -// sign * pow(x, n) / n -// } -// assert( x - ln(2) < 0.001 ) -// """.trimIndent()) -// } } \ No newline at end of file