powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / траблы с посчетами...
20 сообщений из 20, страница 1 из 1
траблы с посчетами...
    #34283638
dark templer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?
...
Рейтинг: 0 / 0
траблы с посчетами...
    #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
траблы с посчетами...
    #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
траблы с посчетами...
    #34284067
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dark templerздраствуйте товарищи, такой вопрос:
double x = 1e40;
x = x - 1;
printf("%f", x);
и выдает то же самое число, то есть 1е40... почему так? пробовал считать через виндовозовский калькулятор, там такая же фигня.. подскажите в чем тут дело?

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

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

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

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

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

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

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

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

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

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


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

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

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

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

double->float->int

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


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