|
|
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
есть код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. получим следующие результаты: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Any ideas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 11:29 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Здесть нет потери точности, потому как double в принциве неточный тип данных. Ты выведи double в полном формате, чтобы не одна десятичная цифра была, а больше, и увидешь все, что происходит. Так что здесь все правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:01 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
MasterZivЗдесть нет потери точности, потому как double в принциве неточный тип данных. Ты выведи double в полном формате, чтобы не одна десятичная цифра была, а больше, и увидешь все, что происходит. Так что здесь все правильно. Да неее... тут че-то другое. 1. cout.precision(10) все равно выводит те же числа. 2. если делаем так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Т.е. какого-то она странным образом округляет/отбрасывает че-то в случае если тип результирующей переменной unsigned long. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:16 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
В VC 6 все нормально выводит. x:1e-009 y:1000000000 z1=x*y:1 z2=x*y:1 x:1.6e-006 y:625000 z1=x*y:1 z2=x*y:1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:31 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
bemtaill какой компилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:41 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:46 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 m> т.к. результат должен быть unsigned, компилятор x приводит m> к unsigned (в резульатае 0), а затем перемножает. Таким m> образом получаем 0 в результатеЕсли мне не изменяет память, то по стандарту два операнда приводятся к максимальному типу, а к типу результата уже приводится результат операции Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:49 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас man_555 m> т.к. результат должен быть unsigned, компилятор x приводит m> к unsigned (в резульатае 0), а затем перемножает. Таким m> образом получаем 0 в результатеЕсли мне не изменяет память, то по стандарту два операнда приводятся к максимальному типу, а к типу результата уже приводится результат операции Posted via ActualForum NNTP Server 1.3 да, помоему так и есть.... компилятор: gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-56) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:56 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 12:59 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
В "древних" компиляторах операнды сперва приводились к типу первого из них. Сравните x*y и y*x. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:05 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
bemtaill man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение Сделай как сказал MasterZiv для двух вариантов. В первом будет 1.000000000, а во втором 0,99999999999 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:06 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
bemtaill man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение а ради эксперимента попробуй z1=y/x; z1=x*(double)y; Интересно, что получится? Про стандарт: не помню, поэтому буду благодарен, если ткнёте носом в нужный абзац. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:10 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Akh bemtaill man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение Сделай как сказал MasterZiv для двух вариантов. В первом будет 1.000000000, а во втором 0,99999999999 Подожди, не понял:) MasterZiv сказал: "Ты выведи double в полном формате, чтобы не одна десятичная цифра была, а больше, и увидешь все, что происходит. Так что здесь все правильно." Ну я и вывожу по десять знаков после запятой. Для обоих вариантов. + почему тогда в таком случае работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Такое ощущение что компилятор глючит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:14 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
LeonMВ "древних" компиляторах операнды сперва приводились к типу первого из них. Сравните x*y и y*x. компилятор не глючит ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:16 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 bemtaill man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение а ради эксперимента попробуй z1=y/x; z1=x*(double)y; Интересно, что получится? Про стандарт: не помню, поэтому буду благодарен, если ткнёте носом в нужный абзац. Ща попробую... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:16 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
bemtaillведь согласно твоему предположению temp=0,99999999 (хотя реально он равен 1) и при присваивании z2=temp ничего не теряется... Такое ощущение что компилятор глючит... Ты уверен, что при выводе в stdout дубль не округляется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:25 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Akh bemtaillведь согласно твоему предположению temp=0,99999999 (хотя реально он равен 1) и при присваивании z2=temp ничего не теряется... Такое ощущение что компилятор глючит... Ты уверен, что при выводе в stdout дубль не округляется? Еще больше не понял:) Это че получается, говоришь вывести дубль а выводит автоматом инт??? ща тогда в дебагере посмотрю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:28 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
bemtaillща тогда в дебагере посмотрю... Вот отсюда и стоит разбиратья ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:31 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 bemtaill man_555imho происходит это потому, что y - unsigned z2 - unsigned т.к. результат должен быть unsigned, компилятор x приводит к unsigned (в резульатае 0), а затем перемножает. Таким образом получаем 0 в результате. Хотя это единственное логичное объяснение а ради эксперимента попробуй z1=y/x; z1=x*(double)y; Интересно, что получится? Про стандарт: не помню, поэтому буду благодарен, если ткнёте носом в нужный абзац. Прикольно: Код: plaintext 1. 2. 3. 4. 5. z1 - double z2 - unsigned int очевидно переполнение UInt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:35 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Akh bemtaillща тогда в дебагере посмотрю... Вот отсюда и стоит разбиратья короче ни че ни где не округлетя - все как на экране так и в дебагере! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:40 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Лана надо работать, а то уже 2 часа на эту хрень убил:)) если у кого какие мысле появятся - пишите, буду рад! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:41 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Лана надо работать, а то уже 2 часа на эту хрень убил:)) если у кого какие мысле появятся - пишите, буду рад! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:44 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Хотите объясню, откуда разница между этим Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. Вы же на x86 тестируете, да :) ? Компилятор приводит x и y к double (естественно), перемножает, в результате получается что-то типа 0.9(9 в периоде). В регистре сопроцессора - то есть десятибайтный тип. Теперь если сразу приводить к long, компилятор делает это прямо из этого регистра сопроцесссора, а там целая часть 0. А если сначала сохранить в переменную double - а это восьмибайтный тип - то произойдет округление к ближайшему числу представимому в double, а это как раз 1. С msvc результаты одинаковые, так как он устанавливает для сопроцессора режим вычислений с восьмибайтной точностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:56 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Кстати если заменить double temp на long double temp (а это десятибайтный тип в gcc и bcc) то снова будет 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 13:58 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
BarloneХотите объясню, откуда разница между этим Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. Вы же на x86 тестируете, да :) ? Компилятор приводит x и y к double (естественно), перемножает, в результате получается что-то типа 0.9(9 в периоде). В регистре сопроцессора - то есть десятибайтный тип. Теперь если сразу приводить к long, компилятор делает это прямо из этого регистра сопроцесссора, а там целая часть 0. А если сначала сохранить в переменную double - а это восьмибайтный тип - то произойдет округление к ближайшему числу представимому в double, а это как раз 1. С msvc результаты одинаковые, так как он устанавливает для сопроцессора режим вычислений с восьмибайтной точностью. Действительно!!! Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:03 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Barlone а Вы уверены, что именно 0.0000016 не представляется точно в формате с плавающей точкой? Как и 0.0000032, 0.0000048, 0.0000064, и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:22 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 Barlone а Вы уверены, что именно 0.0000016 не представляется точно в формате с плавающей точкой? Как и 0.0000032, 0.0000048, 0.0000064, и т.д. Вообще-то. Даже 1.0 не является точным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:25 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
AkhВообще-то. Даже 1.0 не является точнымединица - это любое основание системы в степени 0, где неточность ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:37 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Не, ну 1 то можно представить точно. Проблема в том что результат вычислений не равен этому точному представлению. А 0.0000016 (=1/625000) конечно не может быть представлено точно. Точно можно представить только числа представимые в виде дроби со степенью 2 в знаменателе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:37 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас AkhВообще-то. Даже 1.0 не является точнымединица - это любое основание системы в степени 0, где неточность ? Posted via ActualForum NNTP Server 1.3 Колличество значимых бит не хватает, чтобы быть уверенным, что число представленное в дубле как 1.0, являестя единицей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:59 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Akh A> Колличество значимых бит не хватает, чтобы быть уверенным, A> что число представленное в дубле как 1.0, являестя A> единицейсначала ты говорил про число один (1.0), а теперь про предятавление :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:01 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас Akh A> Колличество значимых бит не хватает, чтобы быть уверенным, A> что число представленное в дубле как 1.0, являестя A> единицейсначала ты говорил про число один (1.0), а теперь про предятавление :) Это я man_555 отвечал. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:12 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
если 1 не точно предсталяется, то по логике тогда, умножив 1 на 1 n раз, я должен получить число более близкое к 0, чем к 1. Правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:45 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555если 1 не точно предсталяется, то по логике тогда, умножив 1 на 1 n раз, я должен получить число более близкое к 0, чем к 1. Правильно? Почему с разу к 0-лю, может к бесконечности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:54 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
AkhПочему с разу к 0-лю, может к бесконечности? вообще-то к 0-лю. 0,99 * 0,99 = 0,9801 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:01 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 AkhПочему с разу к 0-лю, может к бесконечности? вообще-то к 0-лю. 0,99 * 0,99 = 0,9801 Почему это не точное число обязательно должно восприниматься в меньшую сторону? 0.999999999999999999999999999999999999(7)=1.000000000000000000000000000000 1.000000000000000000000000000000000000(2)=1.000000000000000000000000000000 1.000000000000000000000000000000000000(5)=1.000000000000000000000000000001 В скобках, то что выпало за разряды точности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:12 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Akh Почему это не точное число обязательно должно восприниматься в меньшую сторону? 0.999999999999999999999999999999999999(7)=1.000000000000000000000000000000 1.000000000000000000000000000000000000(2)=1.000000000000000000000000000000 1.000000000000000000000000000000000000(5)=1.000000000000000000000000000001 В скобках, то что выпало за разряды точности. конечно необязательно - хоть в большую. Только 1 сколько не умножай на себя всегда будет 1 в представлении float ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:30 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555Только 1 сколько не умножай на себя всегда будет 1 в представлении float Очень хорошо. Но не надо говорить о точном представлении чисел в форматах с плавающей точкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:36 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
AkhОчень хорошо. Но не надо говорить о точном представлении чисел в форматах с плавающей точкой. Чего-то не понял.. а разве нельзя некоторые числа во флоуте точно представить? 1, 44.53 например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:41 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555 AkhОчень хорошо. Но не надо говорить о точном представлении чисел в форматах с плавающей точкой. Чего-то не понял.. а разве нельзя некоторые числа во флоуте точно представить? 1, 44.53 например? Для операций с плавающей точкой существует понятие количество значимых разрядов (определяется длиной мантиссы), которое учитывается для выбора типа представления данных. Результирующее число, которое находится в переменной вещественного типа, соответственно, тоже имеет определенное количество значимых разрядов, но оно обычно меньше, чем типа, ибо, над числами выполняются арефметические операции, которые неуклонно увеличивают погрешность. Максимальная точность числа в вещественном типе = точности типа. Так воспринимают и работают с числами с плавающией точкой. А точно число представляется, .... точно число представляется в int, long , ... . ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 16:55 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
вот оно как! а как это проверить на практике? убедиться собственными глазами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 17:08 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Ну и кто выиграл ? :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 17:27 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
man_555вот оно как! а как это проверить на практике? убедиться собственными глазами? Клади числа в дубль, да умножай их ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 17:29 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасНу и кто выиграл ? :) А с полки пирожок будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 17:34 |
|
||
|
Потеря точности????
|
|||
|---|---|---|---|
|
#18+
Апять шняга разводится :Тынц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 10:14 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030298]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
409ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 738ms |

| 0 / 0 |
