LINUX.ORG.RU

перевод float из IEEE в IBM floating-point format?

 segy, solid rock,


0

1

Мрак и ужас. Сколько лет конвертили данные в seg-Y не заморачиваясь на представление чисел, и все были довольны. Новый заказчик пользуется какими то вьюверами, которые жрут только IBM (описание SEGY в этом смысле прекрасно «The trace data is most often in 32-bit IBM floating point format. Occasionally 32-bit IEEE floating-point format is used.») !!!!11111.

Не подскажете годный фрагмент кода C/C++ который это умеет (преобразовать один float в это г-но)? То, что нагуглилось, режет то ли отрицательные числа до нуля.

Обратно боюсь тоже надо будет...

★★★★★

Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от andreyu

Естественно. Есть какой то float в IEEE, его надо перевести в IBM и записать на диск fwrite-ом. Ну и босюь что будет обратная задача - есть прочитанный с диска IBM float, его надо перевести в IEEE.

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Да, я это пробовал. ХЗ кто этот Larry Jones, но у него там где то косяк - что то со знаком преобразования. Проверить я понятно могу только на этом кривом вьювере, ну он и отображает что положительные (вроде таки именно положительные) отсчеты заменяются нулями.

Вааще удивительное рядом - почему эта байда не входит в какую нить условно-околостандартную библиотеку.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

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

anonymous
()
Ответ на: комментарий от AIv

если будет парочка, а лучше 10, примеров пар бинарной формы записи чисел, то решу вашу проблему

anonymous
()
Ответ на: комментарий от anonymous

В чем сложность разобраться в формате, взять ту же статью выше по ссылке и наговнокодить 2 функции?

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

если будет парочка, а лучше 10, примеров пар бинарной формы записи чисел, то решу вашу проблему

Чего нету, того нету;-( Натыкался на онлайн-конвертер, но чего то найти не могу.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

мне стало грустно=( один наговнокодил, другой не может, а задачка какая-то простая.

void ieee2ibm(void *to, const void *from, int len)
{
register unsigned fr; /* fraction */
register int exp; /* exponent */
register int sgn; /* sign */
Преждевременная оптимизация рядом с кривым прототипом функции. Одно название грамотное.

anonymous
()
Ответ на: комментарий от AIv

и вообще про твой ноль все задокументировано. When precision is lost, rounding is toward zero (because it's fast and easy — if someone really wants round to nearest it shouldn't be TOO difficult)

anonymous
()
Ответ на: комментарий от AIv

а кстати, может там сам вьювер не умеет показывать отрицательные числа? что если создать файл с данными в которых перебраны все варианты записи числа начиная с 20-того бита.

void test1()
{
  int i,x;
  for(i=0;i<4096;i++)
  {
    x = i<<20;
    fwrite(&x, 4, 1, stdout);
  }
}
void test2()
{
  int i,x, rev;
  for(i=0;i<4096;i++)
  {
    x = i<<20;
    rev = (((x>>(8*0))&0xff)<<(8*3))|
          (((x>>(8*1))&0xff)<<(8*2))|
          (((x>>(8*2))&0xff)<<(8*1))|
          (((x>>(8*3))&0xff)<<(8*0));
    fwrite(&rev, 4, 1, stdout);
  }
}

anonymous
()
Ответ на: комментарий от anonymous

Умеет.

Сейчас вопрос с переводом IEEE->IBM решился (отчасти) - в заголовке можно таки указать что это IEEE. Но вот IBM->IEEE наверное со временем понадобиться.

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.