|
|
|
Потеря точности????
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34050118&tid=2030298]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
404ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 726ms |

| 0 / 0 |
