D'alex писал(а):Как альтернатива:
Тогда:Проблема в том, что очень многие заказчики ставят одно из обязательных условий - "Не использовать freeware или shareware программы и компиляторы".
PBDN писал(а):Кажется последняя капля сделала свое дело.
По крайней мере для меня точно.
После того как в Повер Бэйсике решили что их изделие самое лучшее на земле, и это дает им право менять обще признанные законы математики то становится немного страшно. Какие еще супер "гениальные" идеи воплощены в этом изделии которое явно застряло на уровне прошлого века стоит только догадываться. А терять время на раскопки и замены на ассемблер пасхальных яиц дяди Боба уже осточертело.
Если кто пишет программы от которых зависят человеческие жизни, сделайте соответствующие выводы.
Если кто надумает переключаться, может начнем новую серию постов /PB2C/ ?
D'alex писал(а):Как альтернатива:
http://www.tiflocomp.ru/docs/programming/fbc.php
http://ru.wikipedia.org/wiki/FreeBasic
IDE:
http://www.assembler.ca/radasm/fbedit/index.html
Сайт разработчика:
http://www.freebasic.net
Текущая версия 0.18.2 Beta(2007-10-12)
jangle писал(а):А в чем собственно проблема? Что не получается?
99,9% всех ошибок - это вина программиста.
PBDN писал(а):jangle писал(а):А в чем собственно проблема? Что не получается?
99,9% всех ошибок - это вина программиста.
Эт мы знаем. Только в данном случае выплыл тот самый 0.1%
LOCAL n,f AS DWORD
n = &h8fffffff???
f = n * n * 2
? "ПБ результат = 0х"+HEX$(f),,"Любой другой компилятор = 0хC0000002"
#Compile Exe
#Dim All
Function PBMain () As Long
Local n As Ext
Local f As Ext
n = &h8fffffff
f = n * n * 2
? "ПБ результат = 0х"+Hex$(f),,"Любой другой компилятор = 0хC0000002"
End Function
),,"Любой другой компилятор = 0хC0000002
Sub main()
Dim f As Variant, n As Variant
n = CDec(&H8FFFFFFF)
f = n * n * 2
Debug.Print f
End Sub
jangle писал(а):Мда.. Маразм крепчает... Начинаем учить арифметику за 5 класс.
f = 2415919103 * 2415919103 * 2
Получаем:
f= 11673330224480649218
Отсюда вывод, для такого большого числа нужен тип EXT - 1.2*10^4932
Изменяем код:
Как видишь, это все тот же 99,9% ошибок программиста
Dark Machine писал(а):Какой компиль?
Если проверял на другом языке програмирования, то полный исходник именно этого кусочка кода (не весь RC6) плиз.
PBDN писал(а):jangle писал(а):Как прокомментируем подобные чудеса ?
jangle писал(а):PBDN прочитай мой предущий пост. Медленно... Вдумчиво.. Пытаясь осознать прочитанное. Можно три раза.
Затем попытайся ответить для себя, почему код:
In order to generate tight, fast code, we have eliminated quite a bit of error checking that was done in earlier compilers (such as Division-by-Zero, Numeric Overflow, and most other numeric checking errors). While this results in code that is considerably smaller and faster than any other Windows compiler product, it does put more of an onus on the programmer to write code that is bug-free, or code that does its own error checking and validation of its data.
For example, an application that performs exponentiation of a negative value to a fractional power (-5^1.9) will not trigger a run-time error, but the result of the expression will be undefined. Therefore, it makes sense for the application to make some attempt to validate or restrict the numeric range of the arguments of this kind of expression.
jangle писал(а):Эх- Гвозди бы делать из этих людей, крепче бы не было в мире гвоздей!
PBDN - а кто собственно обещал,
что при переполнении разрядной сетки формата числа, ты получишь Overflow? Боб обещал? Нет совсем наоборот, это даже в хелпе описано:
In order to generate tight, fast code, we have eliminated quite a bit of error checking that was done in earlier compilers (such as Division-by-Zero, Numeric Overflow, and most other numeric checking errors).
...
...
Контроль, за возможным переполнением, возложен на плечи программиста.
Отчасти из-за этого, скорость математических расчетов на PB значительно выше, чем у VB6. Просто нет лишних проверок.
Если она тебе нужна, ты сам ее добавишь в ущерб скорости работы кода.
Описаная тобой ситуация - секрет Плишинеля, уже много раз отпедалированная на официальном форуме PB.
Dingo писал(а):Фирма формально права (она не обещает младшей части от результата, как было бы логично ожидать), но по сути поведение компилятора как минимум(!) "обманывает" ожидания. т.ч. негодование PBDN я прекрасно понимаю.
Кроме того, лично меня бесит нескончаемость "DIM N AS BYTE: FOR N = 0 TO 255: PRINT N;: NEXT N",
Да и упёртость фирмы в своей правоте
Могли бы пойти на мировую и включить в список пожеланий следующего релиза что ли... Хочу надеяться!
Печально всё это.
P.S. Такой вариант как:
LOCAL n,f AS DWORD
n = &h8fffffff???
'f = n * n * 2
f = n * n
f = f * 2
? Hex$(f)
Но кого волнует математика, если важнее производительность...
PBDN писал(а):jangle писал(а):Эх- Гвозди бы делать из этих людей, крепче бы не было в мире гвоздей!
Dingo писал(а):
Печально всё это.
P.S. Такой вариант как:
LOCAL n,f AS DWORD
n = &h8fffffff???
'f = n * n * 2
f = n * n
f = f * 2
? Hex$(f)
конечно же даст ожидаемое C0000002h, хотя последовательность мат.операций та же. Но кого волнует математика, если важнее производительность...
#Compile Exe
#Dim All
Function GetFPU_Status As Long
Local Fpu As Dword
! mov eax, 0
! fstsw ax
! mov Fpu, eax
! fclex
! cmp Fpu, 1
! je FpuMsgOut
Exit Function
FpuMsgOut:
GetFPU_Status=1
End Function
Function PBMain () As Long
Local n,f As Dword
n = &h8fffffff???
f = n * n * 2
If GetFPU_Status Then
MsgBox "FPU выбросил исключение на (f = n * n * 2) !"
End If
f = n * n: f = f * 2
If GetFPU_Status Then
MsgBox "FPU выбросил исключение на (f = n * n: f = f * 2) "
End If
End Function
Сложение БЕЗЗНАКОВЫХ чисел при возникновении переноса протекает неправильно (ТОЛЬКО из-за переноса из разрядной сетки - перенос в знаковый разряд роли не играет). При интерпретации слагаемых как беззнаковых чисел перенос из разрядной сетки приводит к потере старших разрядов числа, и результат оказывается неверным.
jangle писал(а):Да ладно, зачем на шутки обижаться!
Наверное соглашусь с Бобом, не надо допускать переполнения разрядной сетки формата числа.
Или, в противном случае, все-же проверять состояние флагов FPU после "опасных операций c
переполнением"
Прямо по нашей теме статья с WASM`а:
Перенос и переполнение - что они представляют собой на самом деле?
http://www.wasm.ru/print.php?article=carry_overflow
А там любопытный фрагмент, неужели правда? Или все таки врут?
;// 253 + 5 = 2 (неверно)
; ИЛИ -3 + 5 = 2 (верно)
Такое преобразование над числом так же называется дополнением до двух.
А само представление отрицательных чисел - дополнительным кодом. (прим. ред.)
253+1 = 254 (1)
254+1 = 255 (2)
255+1 = 0 (3) <-переполнение и сброс. Но адрес=ноль, это не пустошь, а реальное указание на что-то.
0 + 1 = 1 (4)
1 + 1 = 2 (5)
"Не использовать freeware или shareware программы и компиляторы".
Насчет PureBASIC тоже самое, его кстати разрабатывает один человек, но прикидывается софтверной компанией.
And the last one, I don’t trust anymore to PowerBasic compiler, because mathematic rules may be broken somewhere else inside PB engine. I don’t want spend hours to track down errors, which is appear by not my fault.
I don’t want go to a jail, if in some day my program will drive external equipment (which can be electric power station, medical equipment…) in a wrong way, and will hurt people’s lives.
I don’t want to see MCM face, when in some day IRS will found incorrect calculation in his PaymentProviderParther.
I don’t want looks stupid, when I will need explain to a customers why do I need use signed integer, when I need DWORD.
And I don’t want loose my reputation and my money just because someone forgets the math rules.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5