Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / траблы с посчетами... / 20 сообщений из 20, страница 1 из 1
25.01.2007, 23:49
    #34283638
dark templer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
здраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?
...
Рейтинг: 0 / 0
26.01.2007, 03:17
    #34283729
Вечность
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
dark templerздраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?Дело в точности представления вещественных чисел:) Тип double обеспечивает 15-16 значащих цифр в мантисе, поэтому вычитание единички равносильно киданию маленьких камушков в окен с целью вызвать цунами:)
Можешь провести, например, такой смелый эксперимент:
Код: plaintext
1.
2.
double x = 1e40;
x = x - 1e20;
printf("%f", x);
и подивиться результатам:)

P.S.: Чти хелп, товарищь!
...
Рейтинг: 0 / 0
26.01.2007, 09:36
    #34284039
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
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
...
Рейтинг: 0 / 0
26.01.2007, 09:43
    #34284067
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
dark templerздраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?

Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс?
...
Рейтинг: 0 / 0
26.01.2007, 10:17
    #34284190
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
MasterZiv
PS: вообще все это проходят в высшей школе. Не проходили ?
Или еще не проходили ?
Posted via ActualForum NNTP Server 1.3
не это в средней школе проходят, по-моему класс 10 информатики, он кже забыл:)
...
Рейтинг: 0 / 0
26.01.2007, 10:39
    #34284295
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
Akh dark templerздраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?

Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс? фин.испекция будет!
...
Рейтинг: 0 / 0
26.01.2007, 10:55
    #34284373
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
man_555 Akh dark templerздраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?

Если у тебя будет 10000000000000000000000000000000000000000$, ты будешь обращать внимание, куда делся 1 бакс? фин.испекция будет!

Аффтар раскрыт.
...
Рейтинг: 0 / 0
26.01.2007, 15:07
    #34285642
dark templer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
так а как от этого избавлятца? у меня изза этого вся прога работает коряво..привожу листинг:
#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. Подскажите может формулу переделать или еще как..
...
Рейтинг: 0 / 0
26.01.2007, 15:16
    #34285677
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
может, воспользоваться набором инструкций XXE? Или как оно там называется… в общем, используй тип float128.
...
Рейтинг: 0 / 0
26.01.2007, 16:48
    #34286152
dark templer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
maXmoможет, воспользоваться набором инструкций XXE? Или как оно там называется… в общем, используй тип float128.

я в болрандовском компиляторе пишу под дос, там нету такой темы
...
Рейтинг: 0 / 0
26.01.2007, 17:05
    #34286228
LeonM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
dark templerПодскажите может формулу переделать ...
Очень разумная мысль.
А еще нужно определить, что в данной задаче следует считать нулем.
...
Рейтинг: 0 / 0
26.01.2007, 18:17
    #34286498
dark templer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
LeonM dark templerПодскажите может формулу переделать ...
Очень разумная мысль.
А еще нужно определить, что в данной задаче следует считать нулем.
в смысле? ноль он и есть ноль
...
Рейтинг: 0 / 0
26.01.2007, 18:40
    #34286543
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
dark templer пишет:
> так а как от этого избавлятца? у меня изза этого вся прога работает

Никак. Тебе это не должно мешать. Если мешает, то ты выбрал
неправильный тип данных для своей переменной.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
26.01.2007, 18:48
    #34286564
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
dark templer пишет:

> в смысле? ноль он и есть ноль

Ну не совсем. Вот 1*10**-200 - это ноль?
а 1*10**-1000 - тоже нет ? Но ведь так же близко, правда ?

Вот давай рассмотрим множество вещественных чисел и
его представление в ЭВМ. Звездочками обозначим
числа, представимые в ЭВМ

Здесь чисел, представимых в ЭВМ
НЕТ \
\
| |
--------------------------0--------------------------->
**********************| * |************************ ...
мин. по | мин. по
модулю | модулю
отрицательное | пложительное
число | число
----------|---------
|
Сам ноль представим.


Так что что такое ноль - это еще вопрос.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
26.01.2007, 20:23
    #34286751
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Здесь чисел, представимых в ЭВМ
                     НЕТ  \
                           \
                      |       |  
--------------------------0--------------------------->
**********************|   *   |************************ ...
               мин. по    |  мин. по
               модулю     |  модулю
           отрицательное  | пложительное
               число      |    число 
                ----------|---------
                          |
                     Сам ноль представим.

Так должно было быть.
...
Рейтинг: 0 / 0
30.01.2007, 09:26
    #34291629
michael_is_98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
Посмотрите здесь обсуждение схожей темы

http://forum.codenet.ru/showthread.php?t=24605&highlight=Floating-point+consistensy
...
Рейтинг: 0 / 0
30.01.2007, 10:10
    #34291718
michael_is_98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
Вообще верное преобразование вещ. числа в целое - это цепочка

double->float->int
...
Рейтинг: 0 / 0
30.01.2007, 10:15
    #34291736
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
michael_is_98Вообще верное преобразование вещ. числа в целое - это цепочка

double->float->int

Обоснование?
...
Рейтинг: 0 / 0
30.01.2007, 10:23
    #34291766
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
Akh michael_is_98Вообще верное преобразование вещ. числа в целое - это цепочка
double->float->int
Обоснование?
А это враньё! Какое тут может быто обоснование!
Ладно, тогда так
Th Преобразование double -> int идёт на прямую
док-во: разрядность int и float совпадают, поэтому float не может хранить большее кол-во значений, чем int. Но диапазоны представления float шире -> невозможна однозначная перекодировка. Но при перекодировке int <> double потерь нет -> ЧТД
...
Рейтинг: 0 / 0
30.01.2007, 10:48
    #34291855
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
траблы с посчетами...
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 будет происходить потеря точности. С доубле в этом случае потери не будет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / траблы с посчетами... / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]