|
|
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
здраствуйте товарищи, такой вопрос: double x = 1e40; x = x - 1; printf("%f", x); и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 23:49 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templerздраствуйте товарищи, такой вопрос: double x = 1e40; x = x - 1; printf("%f", x); и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?Дело в точности представления вещественных чисел:) Тип double обеспечивает 15-16 значащих цифр в мантисе, поэтому вычитание единички равносильно киданию маленьких камушков в окен с целью вызвать цунами:) Можешь провести, например, такой смелый эксперимент: Код: plaintext 1. 2. P.S.: Чти хелп, товарищь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 03:17 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templer пишет: > double x = 1e40; > x = x - 1; > printf("%f", x); > и выдает то же самое число, то есть 1е40... почему так? пробовал считать Особенности арифметики с плавающей точкой. Есть такая штука, "потеря точности" называется. double, float - неточные числа, 10**40 - 40 десятичных знаков 1. - только один. при приведении мантиссы 1.0 к тому же порядку (10**40) число 1 сдвигается вправо на 40 десятичных знаков, и значащая единица спадает с разрядной сетки, в которую естественно 40 десятичных знаков не влезает. Примерно так: 100000000000000000000000000000000000000 * 10**2 0000000000000000000000000000000000000000.01 * 10**2 |-------------------------------------| Допустим это - разрядная сетка. В итоге эта несчастная единица просто теряется. Я все это изобразил в десятичной системе счисления, для наглядности, но в процессоре естественно все в двоичной. Ну и некоторые волькости в нормализации мантиссы тоже допустил, но это не очень важно. PS: вообще все это проходят в высшей школе. Не проходили ? Или еще не проходили ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 09:36 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templerздраствуйте товарищи, такой вопрос: double x = 1e40; x = x - 1; printf("%f", x); и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело? Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 09:43 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
MasterZiv PS: вообще все это проходят в высшей школе. Не проходили ? Или еще не проходили ? Posted via ActualForum NNTP Server 1.3 не это в средней школе проходят, по-моему класс 10 информатики, он кже забыл:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:17 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Akh dark templerздраствуйте товарищи, такой вопрос: double x = 1e40; x = x - 1; printf("%f", x); и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело? Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс? фин.испекция будет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:39 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
man_555 Akh dark templerздраствуйте товарищи, такой вопрос: double x = 1e40; x = x - 1; printf("%f", x); и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело? Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс? фин.испекция будет! Аффтар раскрыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 10:55 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
так а как от этого избавлятца? у меня изза этого вся прога работает коряво..привожу листинг: #include <math.h> #include <conio.h> #include <stdio.h> main(){ float the_a, the_b, the_c, spec_x1, spec_x2; double the_d, the_x1, the_x2, the_spec_x1, the_spec_x2; char c_cont; do{ clrscr(); printf ("Input coefficients of quadratic equation, such as Ax^2+bx+c=0:\nCoefficient <A>: "); scanf ("%f", &the_a); printf("Coefficient <B>: "); scanf("%f",&the_b); printf("Coefficient <C>: "); scanf ("%f",&the_c); if (the_a==0){ // esli yravnenie ne kvadratnoe if(the_b == 0){ // esli B = 0 do{ printf("Error 'zero divide'. Input correct <B>: "); scanf("%f", &the_b); }while(the_b==0); } printf ("The equation is simple, x = %f", -the_c/the_b); // esli yravnenie kvadratnoe }else{ the_d = the_b*the_b-4*the_a*the_c ; // esli diskriminant < 0 if (the_d < 0 ){ printf("x = %f +- %f i",(-the_b)/(2*the_a), sqrt(fabs(the_d))/(2*the_a)); // esli diskriminant > 0 }else{ the_x1 = (-the_b+sqrt(the_d))/(2*the_a); the_x2 = (-the_b-sqrt(the_d))/(2*the_a); printf ("x1 = %f \nx2 = %f",the_x1,the_x2); // vichislenie ytochnennih kornei if (the_b > 0){ the_spec_x1 = (-2*the_c)/(the_b+sqrt(the_d)); the_spec_x2 = (-the_b-sqrt(the_d))/(2*the_a); printf("\nSpecified x1 = %3.20f \nSpecified x2 = %3.20f",the_spec_x1, the_spec_x2); }else{ the_spec_x1 = (-the_b+sqrt(the_d))/(2*the_a); the_spec_x2 = (-2*the_c)/(the_b - sqrt(the_d)); printf ("\nSpecified x1= %3.20f \nSpecified x2 = %3.20f", the_spec_x1, the_spec_x2); } } } printf ("\n\nA you sure to continue?(y/n) "); fflush(stdin); scanf ("%c",&c_cont); }while (c_cont == 'y' || c_cont == 'Y'); } короче при вычислении уточненных корней, при значениях А=1е-20, В=1е20, С=1е20, получаются корни -1.000000 и -1.000000051775356400000000000000000000000у+40, так вот если подставлять -1 и посчитать на бумажке, то получается 1е-20 = 0. Подскажите может формулу переделать или еще как.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 15:07 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
может, воспользоваться набором инструкций XXE? Или как оно там называется… в общем, используй тип float128. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 15:16 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
maXmoможет, воспользоваться набором инструкций XXE? Или как оно там называется… в общем, используй тип float128. я в болрандовском компиляторе пишу под дос, там нету такой темы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 16:48 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templerПодскажите может формулу переделать ... Очень разумная мысль. А еще нужно определить, что в данной задаче следует считать нулем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 17:05 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
LeonM dark templerПодскажите может формулу переделать ... Очень разумная мысль. А еще нужно определить, что в данной задаче следует считать нулем. в смысле? ноль он и есть ноль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 18:17 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templer пишет: > так а как от этого избавлятца? у меня изза этого вся прога работает Никак. Тебе это не должно мешать. Если мешает, то ты выбрал неправильный тип данных для своей переменной. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 18:40 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
dark templer пишет: > в смысле? ноль он и есть ноль Ну не совсем. Вот 1*10**-200 - это ноль? а 1*10**-1000 - тоже нет ? Но ведь так же близко, правда ? Вот давай рассмотрим множество вещественных чисел и его представление в ЭВМ. Звездочками обозначим числа, представимые в ЭВМ Здесь чисел, представимых в ЭВМ НЕТ \ \ | | --------------------------0---------------------------> **********************| * |************************ ... мин. по | мин. по модулю | модулю отрицательное | пложительное число | число ----------|--------- | Сам ноль представим. Так что что такое ноль - это еще вопрос. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 18:48 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Так должно было быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 20:23 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Посмотрите здесь обсуждение схожей темы http://forum.codenet.ru/showthread.php?t=24605&highlight=Floating-point+consistensy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 09:26 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Вообще верное преобразование вещ. числа в целое - это цепочка double->float->int ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 10:10 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
michael_is_98Вообще верное преобразование вещ. числа в целое - это цепочка double->float->int Обоснование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 10:15 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Akh michael_is_98Вообще верное преобразование вещ. числа в целое - это цепочка double->float->int Обоснование? А это враньё! Какое тут может быто обоснование! Ладно, тогда так Th Преобразование double -> int идёт на прямую док-во: разрядность int и float совпадают, поэтому float не может хранить большее кол-во значений, чем int. Но диапазоны представления float шире -> невозможна однозначная перекодировка. Но при перекодировке int <> double потерь нет -> ЧТД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 10:23 |
|
||
|
траблы с посчетами...
|
|||
|---|---|---|---|
|
#18+
Den_di Akh michael_is_98Вообще верное преобразование вещ. числа в целое - это цепочка double->float->int Обоснование? А это враньё! Какое тут может быто обоснование! Ладно, тогда так Th Преобразование double -> int идёт на прямую док-во: разрядность int и float совпадают, поэтому float не может хранить большее кол-во значений, чем int. Но диапазоны представления float шире -> невозможна однозначная перекодировка. Но при перекодировке int <> double потерь нет -> ЧТД Согласен, но доказательство какое-то не понятное. ;) Во всяком случае, мне. Дело в том, что у флоат мантисса уже чем у инт (я беру int четыре байта и флоат тоже 4 байта). Если у флоат мантисса 23 бита, то у int она равна этим же 4-м байтам, т.е. 32-м битам. Поэтому можно посчитать, что при подсчете с помощью float и последующим преоразованием в int для чисел из диапазона 2^23...2^32 будет происходить потеря точности. С доубле в этом случае потери не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 10:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34291718&tid=2029549]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 463ms |

| 0 / 0 |
