more docs
This commit is contained in:
parent
697bafdcee
commit
55fd3ea716
@ -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 )
|
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читается от предыдущего члена, в нашем случае это можно было бы записать через итератор, что мы вскоре добавим.
|
Во многих случаях вычисление $n+1$ члена значительно проще cчитается от предыдущего члена, в нашем случае это можно было бы записать через итератор, что мы вскоре добавим.
|
||||||
|
|
||||||
(продолжение следует)
|
(продолжение следует)
|
||||||
|
@ -1661,28 +1661,5 @@ class ScriptTest {
|
|||||||
assert( x - ln(2) < 0.001 )
|
assert( x - ln(2) < 0.001 )
|
||||||
""".trimIndent())
|
""".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())
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user