powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / float + double
15 сообщений из 15, страница 1 из 1
float + double
    #34659864
1211212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем,

VS2005, Win32

пишу следующую вещь:
Код: plaintext
1.
2.
3.
4.
5.
	float s1 =  3 .402823466E+ 038 , s2 =  1 .000000000E+ 038 ;
	ATLTRACE("%f %f\n", s1,  3 .402823466E+ 038 );
	ATLTRACE("%f %f\n", s2,  1 .000000000E+ 038 );
	ATLTRACE("%e %e\n", s1,  3 .402823466E+ 038 );
	ATLTRACE("%e %e\n", s2,  1 .000000000E+ 038 );

Вывод в консоль:
Код: plaintext
1.
2.
3.
4.
 340282346638528860000000000000000000000 . 000000   340282346600000020000000000000000000000 . 000000 
 99999996802856925000000000000000000000 . 000000   99999999999999998000000000000000000000 . 000000 
 3 .402823e+ 038   3 .402823e+ 038 
 1 .000000e+ 038   1 .000000e+ 038 
Как видно при обычном выводе значения различаются, при экспоненциальном - совпадают. Это при выводе в строку.

Использование
Код: plaintext
1.
atof("1.000000000E+038")
дает примерно тот же результат.

Вопрос: существует ли какая-нибудь возможность присвоить в тип float или double значение "1.000000000E+038" или любое
другое значение для которого возникает такой мусор?

Очевидно, об ошибках округления здесь не может быть речи - простое присваивание.

Заранее спасибо.
...
Рейтинг: 0 / 0
float + double
    #34659878
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 wrote:

> Вывод в консоль:
> 340282346638528860000000000000000000000.000000
> 340282346600000020000000000000000000000.000000
> 99999996802856925000000000000000000000.000000
> 99999999999999998000000000000000000000.000000 3.402823e+038 3.402823e+038
> 1.000000e+038 1.000000e+038
А что, собственно, вам не нравится? Все правильно,
присваивается "приблизительно" 1e38, ведь, как я понимаю, в float степень
возведения (или как она там называется) не десятичная, а двоичная, а 1E38
нельзя при помощи доступных битов флоата смещением получить Попробуйте
более высокую точность поставить, но это все равно не поможет. Лучше
использовать библиотеку для работы с целыми числами произвольного размера,
вроде бы в состав GNU bc (который может целочисленно 65536 возвести в
степень 65536, без потерь точности) такая входит, доступна под лицензией
GNU GPL.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34659955
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос неясен. Что нужно-то получить?

Есть библиотека GMP, если что.
...
Рейтинг: 0 / 0
float + double
    #34659993
1211212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
griegВопрос неясен. Что нужно-то получить?

присваивая 1.000000000E+038, нужно получить в переменной 1.000000000E+038.

griegЕсть библиотека GMP, если что.

не подскажите адрес?
...
Рейтинг: 0 / 0
float + double
    #34660115
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 пишет:

> float s1 = *3*.402823466E+*038*, s2 = *1*.000000000E+*038*;
> Вопрос: существует ли какая-нибудь возможность присвоить в тип float или
> double значение "1.000000000E+038" или любое
> другое значение для которого возникает такой мусор?

Да

>
> Очевидно, об ошибках округления здесь не может быть речи - простое
> присваивание.

Это они и есть. Присваивание в числа с плавающей точкой уже
подразумевает округление. Потому что ты переводишь число из
десятичной дроби в двоичную.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34660118
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 пишет:
> Есть библиотека GMP, если что
> не подскажите адрес?
www.gnu.org и далее в каталог.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34660526
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 wrote:

> не подскажите адрес?
находится в гугле запросом GNU GMP

grieg wrote:
> Вопрос неясен. Что нужно-то получить?
Человек хочет во флоате сохранить точное значение 1E38, без ошибок
округления. т.е. не 99999... а 100000.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34660858
1211212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за отклики и ссылки.

На самом деле, я действительно не понимаю почему возникает ошибка округления.

Из сказанного следует, что он не понимает, что справа расположено число float и приводит (вычисляет) переданное значение к формату хранения типа float.

Почему ему просто не положить переданное точное значение мантиссы в мантиссу переменной, а экспоненты в экспоненту - может это можно как-то указать?
...
Рейтинг: 0 / 0
float + double
    #34660899
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 пишет:

> На самом деле, я действительно не понимаю почему возникает ошибка
> округления.

Это ты не поймешь, если не знаешь, как храняться числа с плавающей
точкой в ЭВМ.

> Почему ему просто не положить переданное точное значение мантиссы в
> мантиссу переменной, а экспоненты в экспоненту - может это можно как-то
> указать?

Они у тебя десятичные. А в компьютере - двоичные.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34660908
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212Почему ему просто не положить переданное точное значение мантиссы в мантиссу переменной, а экспоненты в экспоненту - может это можно как-то указать?

38 по основанию 2 целочисленно не раскладывается.
...
Рейтинг: 0 / 0
float + double
    #34660943
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh 1211212Почему ему просто не положить переданное точное значение мантиссы в мантиссу переменной, а экспоненты в экспоненту - может это можно как-то указать?

38 по основанию 2 целочисленно не раскладывается.

Тьфу, сорри. Единица с 38-ю нулями на 2 не раскладывается.
...
Рейтинг: 0 / 0
float + double
    #34660946
1211212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно, извиняюсь за назойливость...

Какие-нибудь итерации имеют смысл? Скажем, через строку корректируя ошибку?
...
Рейтинг: 0 / 0
float + double
    #34660973
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212Ясно, извиняюсь за назойливость...

Какие-нибудь итерации имеют смысл? Скажем, через строку корректируя ошибку?

Если у вас есть допустимая погрешность, то работайте с вещественными числами, и округляйте результат до необходимой точности. Выбирете подходящих тип для хранения данных с запасом ошибки накопления. Если погрешности допустимой нет, то работайте с дробями, используйте целочисленные бибиотеки, которые вам советуют.

Все остальные варинты - это извращения и хитрости, которые можно применить в какой-нибудь отдельной не сложной задаче, но вспоминать их будуте как страшный сон.
...
Рейтинг: 0 / 0
float + double
    #34660977
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1211212 wrote:

> Какие-нибудь итерации имеют смысл? Скажем, через строку корректируя
> ошибку?
Нет. Пока будет использоваться float/double, будут ошибки округления. Все.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
float + double
    #34660990
1211212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОК.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / float + double
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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