|
Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново... |
01.01.2007, 16:49
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Приближение числа
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%
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
02.01.2007, 04:09
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
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 - что может повлиять на его дальнейшую обработку более существенно...
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.01.2007, 05:55
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
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
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.01.2007, 16:20
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Приближение числа
такой подставы я вообще не ожидал... А я ещё филосовствовал об излишестве 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
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.01.2007, 17:05
|
#5
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Приближение числа
Неугомонный)
|
(Offline)
|
|
18.01.2007, 03:10
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Приближение числа
Ржунимагу
Function Get_approach#(x#,eps%)
Return Int(x*(10^eps))/Float(10^eps)
End Function
Команды b3d после C++ несколько непривычны
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
23.01.2007, 02:26
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Приближение числа
Сообщение от impersonalis
такой подставы я вообще не ожидал... А я ещё филосовствовал об излишестве Floor-а...
|
а шо-ж ожидать надо было?
|
(Offline)
|
|
23.01.2007, 02:48
|
#8
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Приближение числа
На С++
9
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
23.01.2007, 02:52
|
#9
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
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.
|
(Offline)
|
|
23.01.2007, 09:03
|
#10
|
|
Re: Приближение числа
так в C++ typecast из floatа в int отрезает в тупую не целую часть числа и все
тоесть 9.9 -> 9
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:14.
|