Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Числовые операции
AndreykaДата: Вторник, 21 Ноября 2006, 21:57 | Сообщение # 1
Новый участник
Группа: Пользователи
Сообщений: 2
Репутация: 0
Награды: 0
Статус: Offline
As-master писал:
Quote

ММВ прекрасно работает с любыми дробными числами.
И, кстати, упомянутый проект калькулятора работает прекрасно!

Или я что-то не понимаю, но вот скрин"калькулятора" (сложение).
 
as-masterДата: Вторник, 21 Ноября 2006, 23:36 | Сообщение # 2
Группа: Удаленные





Мужики, я нашел причину. И она неутешительна.
Мы с вами имеем очередной баг ММВ (но только в версии 497).
Но обо всём по порядку.

Оказалось, что в 496-й версии ММВ проект работает нормально, а в 497-й - игнорирует дробные части чисел.

Однако проект - победитель в конкурсе "Калькулятор" автора QuickSilver складывает числа нормально и в ММВ 497. В чём тут дело?

Я попробовал написать такой сценарий:

x1=2.34
x2=5.237
Itog=x1+x2
DisplayValue("Text","Itog")

Нажал на кнопку - и увидел правильный результат: 7.577
Значит, складывает-то программа нормально. Тогда где баг? И выяснилось, что баг - в новом эдитбоксе, который в ММВ 497 наворотили дополнительными функциями, но... теперь он ПЕРЕСТАЛ ВОСПРИНИМАТЬ ДРОБНЫЕ ЧИСЛА!!!

Делать нечего - придётся жить с этим багом. Спасибо, что хоть сама функция сложения не пострадала smile

А бороться с этим багом будем следующим образом. Раз эдитбокс теперь не воспринимает дробные числа, то будем вводить туда значения не как числовые переменные, а как строковые, с последующим преобразованием их в числовые с помощью команды VAL(). Таким образом, скрипт, например, для сложения, будет выглядеть так:

y = VAL(x1$)+VAL(x2$)
DisplayValue("Результат","y")

Не забудьте только в эдитбоксах изменить тип переменных на "строковые".

Сразу должен заметить, что в связи с этим способом появляется один существенный недостаток: люди по незнанию станут вводить запятую в качестве разделителя, а запятую программа при сложении не понимает, нужно точку. Значит, надо принимать дополнительные меры по запрещению ввода запятой в эдитбоксы.

Я сделал для вас новый пример на основе всего вышеизложенного. В том числе и со скриптами, запрещающими ввод запятых smile Пример возьмите отсюда (1 Кб).

Сообщение отредактировал as-master - Вторник, 21 Ноября 2006, 23:37
 
AndreykaДата: Суббота, 25 Ноября 2006, 10:32 | Сообщение # 3
Новый участник
Группа: Пользователи
Сообщений: 2
Репутация: 0
Награды: 0
Статус: Offline
Quote (as-master)
Мужики, я нашел причину. И она неутешительна.

Тоскливо sad В моем случае- используются трехэтажные формулы для расчетов, скрипты пестрят "волами", и приходится извращатся ужасно. Неужели этот баг нельзя вылечить? Или переходить на 4.9.6 и не мучаться.
 
as-masterДата: Суббота, 25 Ноября 2006, 11:27 | Сообщение # 4
Группа: Удаленные





Quote (Andreyka)
Неужели этот баг нельзя вылечить? Или переходить на 4.9.6 и не мучаться.

Но ведь я же дал простое решение проблемы! Что еще надо?
Можно, конечно, и на 496-й проект слепить, вот только если ты уже сохранял его
в 497-й версии, то в 496-й теперь не откроешь.

 
YURIYДата: Суббота, 25 Ноября 2006, 11:54 | Сообщение # 5
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
Quote (Andreyka)
ли переходить на 4.9.6 и не мучаться.

Конечно, переходить! А в чём проблема? Что-ж поделать, в любой программе есть свои баги... sad



Вечная память Андрею Сергееву!
 
aSanNДата: Вторник, 03 Апреля 2007, 12:51 | Сообщение # 6
Поднаторевший
Группа: Проверенные
Сообщений: 91
Репутация: 2
Награды: 0
Статус: Offline
В создании одной из моих игрушек я столкнулся со одной проблемкой: Как можно вычислить корень числа? Первое что пришло мне в голову это:

sqrtA=A^0.5

но эта строка тупо выдает ответ 1... Че делать? Мож плагины есть какие-нибудь?
_ angry _ angry _ angry _ плиз хелп ас


 
OmarДата: Вторник, 03 Апреля 2007, 12:59 | Сообщение # 7
Группа: Удаленные





Лови aSanN:

If (x = 0) Then
Message("Корень из нуля равен нулю, это знает каждый дурак!","")
Return()
End
i = i + 1
For i=1 To 500
y = x/R
R = R + y
R = R/2
If (i=500) Then
R$ = CHAR®
LoadText("text","R$")
Return()
End
Next i

Автор скрипта - as-master

 
as-masterДата: Вторник, 03 Апреля 2007, 15:31 | Сообщение # 8
Группа: Удаленные





У нас на страницы "Запчасти" для проектов ММВ, вот здесь:
http://www.mmbuilder.ru/mmb-tiles.html
полно примеров, в том числе есть и для вычисления корня числа.
Можешь и пример скачать, по этой ссылке:

Вычисление корня числа

 
OmarДата: Вторник, 03 Апреля 2007, 15:44 | Сообщение # 9
Группа: Удаленные





AS не понимаю зачем одно и тоже два раза?????????????????
 
as-masterДата: Вторник, 03 Апреля 2007, 16:52 | Сообщение # 10
Группа: Удаленные





Quote (Omar)
AS не понимаю зачем одно и тоже два раза?

Это для того, чтобы человек знал о том, что есть такая страница на сайте,
где есть такие вот примеры. Ибо если бы он об этой странице знал,
то не спрашивал бы.

Еще есть вопросы? :)

 
aSanNДата: Среда, 04 Апреля 2007, 10:02 | Сообщение # 11
Поднаторевший
Группа: Проверенные
Сообщений: 91
Репутация: 2
Награды: 0
Статус: Offline
Сэкт Omar!

Обязательно попробую. dance
Если уж на то пошло.. Задам еще вопрос..
Если какие-нибуть приемы в ММВ типа Function (как в паскале или делфе- не важно)???
Или единственый выход написать отдельный скрипт и ссылаться на него в написании основного сценария прожки???
hmm

Добавлено (04 Апреля 2007, 10:02)
---------------------------------------------
as-master, я правильно понял?
Что если мне нужно будет снизить (или увеличить) точность корня, то достаточно будет изменить параметр цыкта:

...
i = i + 1
For i=1 To 500 {например на For i=1 To 100 чтоб снизить}
y = x/R
...
и условие:
...
R = R/2
If (i=500) Then {аналогично}
R$ = CHAR®
...

Я прав? Или 500 что-то конкретное означает?

Я посто не совсем догоняю работу этого скрипта... sad


 
as-masterДата: Среда, 04 Апреля 2007, 10:35 | Сообщение # 12
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Quote (aSanN)
as-master, я правильно понял? Что если мне нужно будет снизить (
или увеличить) точность корня, то достаточно будет изменить параметр цикла

Да, именно так.
Скрипт основан на известном с древности методе вычисления корня
путем последовательных приближений. То есть, чем чаще повторить
вычисление по данной формуле, тем точнее будет ответ.

Сама формула выглядит кажется так:

a = 0,5(X/a + a)

Здесь X - число, из которого извлекают корень,
а - предполагаемый результат.

Как правило, 100 циклов дает уже очень хороший результат.
Например, при вычислении корня из двух получается результат:
1.41421356237, в котором все цифры верные.

Поэтому стоит подумать о том, какая точность тебе нужна.
Иногда можно ограничиться и десятью циклами smile

Quote (aSanN)
Я посто не совсем догоняю работу этого скрипта... sad

Вот, уже объяснил smile


Да пребудет с вами ММВ!
 
aSanNДата: Среда, 04 Апреля 2007, 13:52 | Сообщение # 13
Поднаторевший
Группа: Проверенные
Сообщений: 91
Репутация: 2
Награды: 0
Статус: Offline
As, ответь тогда еще на такой, интересующий меня, вопрос:
Quote (aSanN)
Если какие-нибуть приемы в ММВ типа Function (как в паскале или делфе- не важно)???
Или единственый выход написать отдельный скрипт и ссылаться на него в написании основного сценария прожки???

плиз... smile

Добавлено (04 Апреля 2007, 13:52)
---------------------------------------------
...А то очень не удобно десятки раз писать этот алгоритм с разными переменными, а ссылаться на скрипт засоряет мозг (хотя порой это полезно)...
...
a=Sqrt(b) {Если прописать этот аглоритм заранее. Красиво и удобно. Ты со мной согласен??? question }
...
rolleyes

toizy уже ответил (прим. as-master)


 
toizyДата: Среда, 04 Апреля 2007, 14:07 | Сообщение # 14
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Функций в ММВ нет. Только при помощи скриптов

Жизнь оказалась не такой уж и забавной, как поначалу...
 
  • Страница 1 из 1
  • 1
Поиск: