Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятное содержимое массива после десериализации, %) 
V
    Опции темы
mes
Дата 28.5.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  28.5.2012,  10:02 Найти цитируемый пост)
значит тест на сравнение байтового массива для таких типов некорректен? 

да

Цитата(borisbn @  28.5.2012,  10:09 Найти цитируемый пост)
а ведь проблема именно в long double.
c float и с double - всё в порядке.

просто не проявляется в этих условиях..

Добавлено через 1 минуту и 21 секунду
Цитата(boostcoder @  28.5.2012,  10:12 Найти цитируемый пост)

так может вовсе запретить использование 'long double' ? или оставить на страх и риск юзеров? 


зачем запрещать если оно делает, что требуется ? 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.5.2012, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  28.5.2012,  11:16 Найти цитируемый пост)
зачем запрещать если оно делает, что требуется ?

что-то я не уверен, что подразумевается под "оно делает, что требуется" smile 
PM WWW   Вверх
mes
Дата 28.5.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  28.5.2012,  10:21 Найти цитируемый пост)
что-то я не уверен, что подразумевается под "оно делает, что требуется"

что именно смущает ?


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.5.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



неопределенность.
получить бы еще ссылку на стандарт, где говорится об этой ситуации..

PM WWW   Вверх
mes
Дата 28.5.2012, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



различие бинарного представления ? 

Цитата

Очевидно, что таким образом одно и то же число можно представить по-разному. Рассмотрим пример с длиной мантиссы |M|=4. Число «2» можно представить в следующем виде: 

2 = 10 (в двоичной системе) = 1.000e+1 = 0.100e+2 = 0.010e+3. 

http://habrahabr.ru/post/112953/

Добавлено @ 12:05
Цитата(boostcoder @  28.5.2012,  11:03 Найти цитируемый пост)
получить бы еще ссылку на стандарт, где говорится об этой ситуации.


гугль по IEEE 754

Добавлено через 2 минуты и 39 секунд
Цитата(boostcoder @  28.5.2012,  11:03 Найти цитируемый пост)
неопределенность.

та неопределенность о которой вы говорите свойственна всем вещественным числам, так что запретить придется даже флоат smile


Это сообщение отредактировал(а) mes - 28.5.2012, 12:06


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.5.2012, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



ааа, тогда получается все нормально smile 

всем спасибо.
вопрос закрыт.

PM WWW   Вверх
borisbn
Дата 28.5.2012, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  28.5.2012,  12:05 Найти цитируемый пост)
так что запретить придется даже флоат 

эт точно. сделай вместо
Цитата
lda1[i] = idx;

Код
lda1[i] = idx * 100 + idx / 3.0;

и получишь отличие уже на float
http://liveworkspace.org/code/07bd52329043...118e1e6853568cc


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 28.5.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  28.5.2012,  12:17 Найти цитируемый пост)
получишь отличие уже на float

ага. вижу. ясно.

PM WWW   Вверх
Alexeis
Дата 28.5.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(mes @  28.5.2012,  13:05 Найти цитируемый пост)
Очевидно, что таким образом одно и то же число можно представить по-разному. Рассмотрим пример с длиной мантиссы |M|=4. Число «2» можно представить в следующем виде: 

2 = 10 (в двоичной системе) = 1.000e+1 = 0.100e+2 = 0.010e+3. 

  Это актуально только для текстового представления. Бинарно же не будет вариаций типа 
1.000e+1 / 0.100e+2 / 0.010e+3 , потому как числа с плавающей точкой не хранят позицию запятой и всегда сохраняются в одной форме. Думаю если сериализовать в бинарную форму, то после десериализации получим данные в точности.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
borisbn
Дата 28.5.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Alexeis @  28.5.2012,  13:17 Найти цитируемый пост)
Думаю если сериализовать в бинарную форму, то после десериализации получим данные в точности

Да. Бинарная сеарелизация всё решит. Однако, совпадать будут только значения массива arr[ i ]-тые, а memcmp также может не совпадать.
Я сделал, как Вы и говорили (заполнил массивы только не 0101010, а первый 0x00, а второй 0xFF). Вот рез-ты
http://liveworkspace.org/code/15f9eee08561...1d39b81dc15fa51

хмм. обнаружил интересную деталь: обычное присвоение long double (т.е. если вместо вытаскивания из stringstream'а сделать lda2[i] = lda1[i] ) копирует весь long double включая 0x00 на "незаполненных" местах, а вытаскивание из stingstream'а - нет



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 28.5.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  28.5.2012,  13:32 Найти цитируемый пост)
обнаружил интересную деталь: обычное присвоение long double (т.е. если вместо вытаскивания из stringstream'а сделать lda2[i] = lda1[i] ) копирует весь long double включая 0x00 на "незаполненных" местах, а вытаскивание из stingstream'а - нет

мдя.. smile

PM WWW   Вверх
mes
Дата 28.5.2012, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alexeis @  28.5.2012,  12:17 Найти цитируемый пост)
 Это актуально только для текстового представления. Бинарно же не будет вариаций типа 

ну это естественно, что проблема возникает на стыках конвертации.. как может отличаться бинарное представление, если оно же и сохранено smile

Цитата(borisbn @  28.5.2012,  12:32 Найти цитируемый пост)
 копирует весь long double включая 0x00 на "незаполненных" местах, а вытаскивание из stingstream'а - нет

не понял .. копирование просто копирует бинарное представление, а стрим конвертирует  в/ из строки.. в чем нестыковка то ?


--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 28.5.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(borisbn @  28.5.2012,  14:32 Найти цитируемый пост)
Я сделал, как Вы и говорили (заполнил массивы только не 0101010, а первый 0x00, а второй 0xFF). Вот рез-ты
http://liveworkspace.org/code/15f9eee08561...1d39b81dc15fa51

  Я вижу только 2 байта заполненные FFFF вместо 6ти...
  Аа ну да. Этот компилятор определяет sizeof(long double) как 12 байт. 12 - 10 = 2 .  Тогда вроде все как и ожидалось.
  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.