forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Приближение числа (http://forum.boolean.name/showthread.php?t=2253)

impersonalis 01.01.2007 16:49

Приближение числа
 
Код:

Function Get_approach2#(x#,eps%)
        Local res#,vLEFT#,vRIGHT#
        Local temp#=10^eps
        Local x_s#=Int(x*temp)/temp
        Local mzr%=x*temp-Int(x*(10^(eps-1)))*10
        Local flag%=mzr Mod 2
        vLEFT=x_s+flag*10^(-eps)
        vRIGHT=x_s+flag*10^(-eps)
        If Abs(x-vLEFT)<Abs(x-vRIGHT)
                res=vLEFT
        Else
                res=vRIGHT
        EndIf
        Return res
End Function

Get_approach2# возвращает ближайшее приближенное чётное число от аргумента x# с числом знаков после запятой eps%

Код:

Function Get_approach#(x#,eps%)

        Local res#
        Local temp#=10^(eps+1)
        Local x_s#=Int(x*temp)/temp
        Local mzr%=x*temp-Int(x*(10^(eps)))*10
       
        temp#=10^(eps)
        res=Int(x*temp)/temp
        If mzr>=5
                res=res+10^(-eps)
        EndIf

        Return res
End Function

Get_approach# возвращет приближенное (не обрубленное) число от аргумента x# с числом знаков после запятой eps%

impersonalis 02.01.2007 04:09

Re: Приближение числа
 
ВНИМАНИЕ
Вот за что я не люблю писать мат.проги на B3D за его windows-оподобную страсть показать себя умнее программиста. Как же он обожает округлять чиселки самостоятельно - кодом не корми.
В общем после долгих препирательств пришлось заменить часть кода. Таким образом:
Код:

Function Get_approach2#(x#,eps%)
        Local res#,vLEFT#,vRIGHT#


        Local x_s#=Float(Mid(Str(x),1,Len(Str(Int(x)))+1+eps))

        Local mzr%=Int(Mid(Str(x),Len(Str(Int(x)))+1+eps,1))

       
        Local flag%=mzr Mod 2
        vLEFT=x_s+flag*10^(-eps)
        vRIGHT=x_s+flag*10^(-eps)
        If Abs(x-vLEFT)<Abs(x-vRIGHT)
                res=vLEFT
        Else
                res=vRIGHT
        EndIf
        Return res
End Function

Теперь деление и прочие пертурбации с дробной частью убраны, путём преобразования числа в строку.

Это уже 3ее место в программе где приходится так выпендриваться: то сумма 6 целых чисел принимает вид х.9999, то 0.001 не прибавляется.т.к. это повлечёт переваливание числа за 0.5 - что может повлиять на его дальнейшую обработку более существенно...

impersonalis 04.01.2007 05:55

Re: Приближение числа
 
забыл напостить правку ко 2ой функции:
Код:

Function Get_approach#(x#,eps%)
        Local res#=Float(Mid(Str(x),1,Len(Str(Int(x)))+1+eps))
        Local mzr%=Int(Mid(Str(x),Len(Str(Int(x)))+2+eps,1))
        If mzr>=5
                res=res+10^(-eps)
        EndIf
        Return res
End Function


impersonalis 04.01.2007 16:20

Re: Приближение числа
 
Код:

Int(9.70)=10 ?!
такой подставы я вообще не ожидал... А я ещё филосовствовал об излишестве Floor-а...
Короче:
Код:

Function Get_approach#(x#,eps%)
        Local res#=Float(Mid(Str(x),1,Len(Str(Int(Floor(x))))+1+eps))
        Local mzr%=Int(Mid(Str(x),Len(Str(Int(Floor(x))))+2+eps,1))

        If mzr>=5
                res=res+10^(-eps)
        EndIf
        Return res
End Function

Function Get_approach2#(x#,eps%)
        Local res#,vLEFT#,vRIGHT#


        Local x_s#=Float(Mid(Str(x),1,Len(Str(Int(Floor(x))))+1+eps))

        Local mzr%=Int(Mid(Str(x),Len(Str(Int(Floor(x))))+1+eps,1))

       
        Local flag%=mzr Mod 2
        vLEFT=x_s+flag*10^(-eps)
        vRIGHT=x_s+flag*10^(-eps)
        If Abs(x-vLEFT)<Abs(x-vRIGHT)
                res=vLEFT
        Else
                res=vRIGHT
        EndIf
        Return res
End Function


alcoSHoLiK 04.01.2007 17:05

Re: Приближение числа
 
Неугомонный)

impersonalis 18.01.2007 03:10

Re: Приближение числа
 
Ржунимагу
Код:

Function Get_approach#(x#,eps%)
        Return Int(x*(10^eps))/Float(10^eps)
End Function

Команды b3d после C++ несколько непривычны

HolyDel 23.01.2007 02:26

Re: Приближение числа
 
Цитата:

Сообщение от impersonalis
Код:

Int(9.70)=10 ?!
такой подставы я вообще не ожидал... А я ещё филосовствовал об излишестве Floor-а...

а шо-ж ожидать надо было?

impersonalis 23.01.2007 02:48

Re: Приближение числа
 
На С++
9

HolyDel 23.01.2007 02:52

Re: Приближение числа
 
Код:

Преобразовывает значение в ближайшее целое.

Это то же самое, что и автоматическое конвертирование типов Blitz.
Итак, две команды...

n = значение
n = Int( значение )

... делает то же самое, когда n имеет значение целого числа.

Если Int приложить к дробному числу – оно будет сконвертировано:

Int( "10" ) ........ результат 10
Int( "3.7" ) ....... результат 3, остановка на "." которая не может быть частью целого
Int( "junk3" ) .... результат 0, остановка на "j"

Int конвертирует дробное, приравнивая его к ближайшему целому числу.
ПОМНИТЕ: Это не традиционное значение Int в Basic.

Как насчет чисел, которые на одинаковом отдалении между целыми?
Округляется к ближайшему четному целому:

Int( 2.5 ) ... дает 2
Int( 3.5 ) ... дает 4

См. также: Floor и Ceil для других типов округления.

а в c++ ето просто typecast.

jimon 23.01.2007 09:03

Re: Приближение числа
 
так в C++ typecast из floatа в int отрезает в тупую не целую часть числа и все
тоесть 9.9 -> 9


Часовой пояс GMT +4, время: 02:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot