Вверх ↑
Этот топик читают: Гость
Ответов: 1397
Рейтинг: 50
#1: 2007-04-30 10:25:13 ЛС | профиль | цитата
Выражение (1000.013-1000.007) почему то равно 0.00600000000008549?
code_1359.txt
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1code_1359.txt [537B] [184]
Ответов: 9906
Рейтинг: 351
#2: 2007-04-30 10:28:36 ЛС | профиль | цитата
И в чем вопрос
карма: 9

0
Ответов: 1397
Рейтинг: 50
#3: 2007-04-30 10:31:37 ЛС | профиль | цитата
В том, что данное выражение равно 0.00600000000000000!
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 5446
Рейтинг: 323
#4: 2007-04-30 10:43:01 ЛС | профиль | цитата
Валерий, машинная арифметика в дробных числах не является точной по определению.
карма: 1

0
Ответов: 1397
Рейтинг: 50
#5: 2007-04-30 10:54:05 ЛС | профиль | цитата
Никогда не думал, что настолько
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 9906
Рейтинг: 351
#6: 2007-04-30 11:07:54 ЛС | профиль | цитата
Насколько
Пока я вижу неточность (относительную) в 15-м знаке
карма: 9

0
Ответов: 2125
Рейтинг: 159
#7: 2007-04-30 11:19:34 ЛС | профиль | цитата
Для real, которые используются в HiAsm - так и должно быть. Использование типа с большей точностью на данный момент, по-моему, проблематично, т.к. надо внести довольно много изменений, в т.ч. и в среду.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#8: 2007-04-30 11:25:52 ЛС | профиль | цитата
Большая точность - это 80-бит (в Дельфях - extended)
Команды проца заточены под это ЗНАЧИТЕЛЬНО меньше, чем под 64
Вопрос - нафига козе боян.

Собственно, жизнь говорит, что когда не хватает float (32-бита) - это кривые вычислительные алгоритмы.
За 99% случаев - ручаюсь. Если иметь ввиду "живые" задачи, а не буйные фантазии.
карма: 9

0
Ответов: 2125
Рейтинг: 159
#9: 2007-04-30 11:33:17 ЛС | профиль | цитата
Galkov писал(а):
Команды проца заточены под это ЗНАЧИТЕЛЬНО меньше

Арифметика проца - 80-бит, а вот сохранять и загружать числа ты можешь практически как угодно (в формате 32,64,80-бит)
карма: 1

0
Ответов: 9906
Рейтинг: 351
#10: 2007-04-30 11:37:10 ЛС | профиль | цитата
Да, и для 80 бит - команд на ЭТО требуется больше.
Я же не говорю, что вообще не заточен: МЕНЬШЕ заточен
карма: 9

0
Ответов: 2125
Рейтинг: 159
#11: 2007-04-30 11:42:41 ЛС | профиль | цитата
Galkov писал(а):
для 80 бит - команд на ЭТО требуется больше

Не понял, какая разница между
fld qword [myReal][/code]
и
fld tword [myExtended][/code]
:?:
карма: 1

0
Ответов: 1397
Рейтинг: 50
#12: 2007-04-30 12:45:43 ЛС | профиль | цитата
Galkov писал(а):
Насколько
Пока я вижу неточность (относительную) в 15-м знаке

Меня больше смутило наличие чисел вместо нулей. Вобщем пришлось отрезать ненужную часть.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 9906
Рейтинг: 351
#13: 2007-04-30 13:06:49 ЛС | профиль | цитата
tsdima, а разницу между
fadd qword [myReal][/code]
и
fadd tword [myExtended][/code]
видишь :?:
карма: 9

0
Ответов: 2125
Рейтинг: 159
#14: 2007-04-30 15:13:32 ЛС | профиль | цитата
Ладно, уговорил. Ну будет во втором случае fld faddp, с учётом конвейерной обработки на один такт больше А то и вовсе одинаково, к моменту, когда tword загрузится, faddp уже пару тактов ждать будет
карма: 1

0
Ответов: 9906
Рейтинг: 351
#15: 2007-04-30 23:19:55 ЛС | профиль | цитата
Ну чего ты веришь-то сладким сказкам...

1) Начнем с того, что это не риск, и про один такт - это сказки. Которые может и сбываются, но не всегда, и не везде, и не по любому поводу

2) Во вторых, это вместо 100 байт кода на формулу, уже будет 150. Сказок, что именно этот код и именно твоего приложения попал в кэш - не надо рассказывать.

3) Но самое главное: нет ни одной причины, чтобы я даже начал разбираться в этом.
Кто дружит с арифметикой - тому и 32-х бит хватит (в тех самых 99% случаев).
А кто не дружит - того и Extended не спасет.
Обрати внимание на пример из топика: просто накопленная ошибка будет в 128 раз меньше, но вовсе не нулевая.

4) При этом, проводя вычисления в FPU (extended), и сохраняя как real, мы проводим округления, сбрасывая таки в 0 в большинстве случаев, накопленную ошибку.
Обрати внимание: здесь в результате чистый нулик таки.
Add(MainForm,12116706,161,42)
{
Left=20
Top=105
link(onCreate,5997779:doCalc,[])
}
Add(MathParse,5997779,224,77)
{
MathStr="1/3*3 -1"
link(onResult,12116706:doCaption,[(266,83)(266,32)(151,32)(151,48)])
}
И отгадай с трех раз: был ли бы чистый нулик при Extended
карма: 9

0
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)