|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||
Конвертация IBM float в IEEE float25.01.2020, 20:11. Показов 3869. Ответов 14
Добрый день,
Мне необходимо конвертировать IBM float в IEEE float. По этой ссылке http://support.sas.com/techsup/technote/ts140.pdf имеется код, реализующий данный функционал (начиная со страницы 8 и до конца). Я скопировал этот код в файлы testieee.c и ieee.c. Но так как я новичок в этом деле, не могу понять как мне запустить проект с этими файлами, если они формата .с, а не заголовочные .h? Я использую Qt 5.14.0, MSVC 2017 x64, Windows 10. Проект состоит из пустого файла main.cpp, testieee.c и ieee.c и .pro файл Добавлено через 4 часа 23 минуты подскажите, пожалуйста, вот переписанный ieee.c файл, который должен реализовать конвертирование из IBM to IEEE и наоборот:
ibm_ieee.h:91:13: error: no matching function for call to 'ieee2xpt' ibm_ieee.h:15:6: note: candidate function not viable: no known conversion from 'char *' to 'unsigned char *' for 1st argument ibm_ieee.h:95:9: error: no matching function for call to 'xpt2ieee' ibm_ieee.h:14:6: note: candidate function not viable: no known conversion from 'char *' to 'unsigned char *' for 1st argument ibm_ieee.h:150:5: error: no matching function for call to 'REVERSE' ibm_ieee.h:131:10: note: candidate function not viable: no known conversion from 'unsigned long *' to 'char *' for 1st argument
0
|
||||||
| 25.01.2020, 20:11 | |
|
Ответы с готовыми решениями:
14
опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
Конвертация Float to wchar_t |
|
Злостный нарушитель
10656 / 5804 / 1282
Регистрация: 12.03.2015
Сообщений: 26,797
|
||
| 25.01.2020, 20:29 | ||
|
1
|
||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 25.01.2020, 21:00 [ТС] | |
|
Verevkin, запилить свой мне нравится
![]() вот здесь описание стандарта IBM https://en.wikipedia.org/wiki/... ting_point вот здесь описание стандарта IEEE https://en.wikipedia.org/wiki/IEEE_754 (на русском языке, где приводится формула https://ru.wikipedia.org/wiki/IEEE_754-2008) Стандарт IBM также как и стандарт IEEE это стандарты представления чисел с плавающей точкой. Они используются для представления 32-х и 64-х битовых чисел. Оба стандарта подразумевают, что число может быть представлено согласно следующей формулы: Где: S=знак (0 для положительного и 1 для отрицательного); С=мантисса (коэффициент); Q=экспонента. b=основание (2 или 10) Различие между стандартами IBM и IEEE состоит в том, сколько битов отводится на мантиссу (С) и экспоненту (Q). IBM стандарт предполагает: 1 бит для знака (S) затем 7 битов для мантиссы (S) и 24 бита для экспоненты (Q) IEEE стандарт предполагает: 1 бит для знака (S) затем 8 битов для мантиссы (S) и 23 бита для экспоненты (Q) Я думаю, что для конвертации одного стандарта в другой мне необходимо: 1) считать из моего файла 32 бита. 2) согласно приведенной формулы перевести двоичные знаки (биты) в десятичную систему и подставить числа в формулу. Длина мантиссы и экспоненты определяется тем, в каком стандарте записаны мои данные. 3) после подстановки чисел в формулу я получу число, которое необходимо будет перевести в другой стандарт. Здесь надо подумать как это сделать. Так как знак одинаков для IBM и для IEEE то необходимо найти двоичное представление для мантиссы и экспоненты. Вопрос: как мне прочитать 32 бита и получить массив из 32 чисел?
0
|
|
|
Злостный нарушитель
10656 / 5804 / 1282
Регистрация: 12.03.2015
Сообщений: 26,797
|
||||||||
| 25.01.2020, 23:12 | ||||||||
|
Короче, стандарт IEEE - это сишный нативный тип float, в котором мантисса 23 бита и 8 - экспонента. Надо просто определиться, куда сдвигать поля мантиссы и экспоненты. Зачем какой-то массив? Мож начать проще вот, например, с этого?
1
|
||||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|||||||
| 25.01.2020, 23:42 [ТС] | |||||||
|
Verevkin, спасибо за ссылку
![]() Со структурой я более или менее понял (плохо пока понял там слово union и typedef) Правильно я понимаю, что сейчас для начала мы с вами хотим просто правильно отобразить число стандарта IBM? Минимальный размер считываемого из файла объем данных это 1 байт (насколько у меня получается). Считываю байты из файла с помощью кода:
Кстати компьютер у меня Little Endian Я туповат, но если я иду не в том направлении вы меня поправьте
0
|
|||||||
|
Злостный нарушитель
10656 / 5804 / 1282
Регистрация: 12.03.2015
Сообщений: 26,797
|
|||
| 26.01.2020, 00:05 | |||
|
Добавлено через 3 минуты ![]() Убери файлы, они тебе мешают.
1
|
|||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 26.01.2020, 00:08 [ТС] | |
|
0
|
|
|
Мозгоправ
|
||||
| 26.01.2020, 00:47 | ||||
|
В pdf-е по ссылке есть C-шная программа, которая состоит из основного файла (testieee.c) с функцией main() и файла ieee.c с собственно функцией преобразования. Т.е. проект консольного приложения на С++ в Visual Studio в разделе Source Files должен содержать ieee.c и один из этих двух файлов. Если вы решите использовать оригинальный testieee.c (на C), то в него необходимо внести некоторые правки: 1. Добавить inlude-ы <stdio.h> и <memory.h>. Это как минимум. 2. Привести определения и прототипы функций к стандарту ANSI C (думаю, что современный компилятор будет грязно ругаться на диалект C из 1978 года). 3. Сделать заголовочный файл для ieee.c с прототипами функций (ieee.h) 4. Заголовочный файл ieee.h включить в состав проекта (в раздел Header Files). 5. Добавить #include "ieee.h" в testieee.c. Если вы решите использовать собственный main.cpp (на C++), то в дополнение к вышенаписанному, исходный код из testieee.c нужно будет перенести в main.cpp с попутным переводом (в большей или меньшей степени) с C на C++. В файл ieee.c также необходимо внести правки: 1. Добавить inlude <memory.h>. Это как минимум. 2. Привести определения и прототипы функций к стандарту ANSI C. 3. Добавить #include "ieee.h". Возможно, в самое начало testieee.c до include-ов, нужно будет добавить #define _CRT_SECURE_DEPRECATE_MEMORY, что бы компилятор не ругался на "небезопасные" функции.После этого можно пробовать откомпилировать и запустить программу. Для работы в другом проекте (Qt, WinAPI, MFC, etc.) нужны будут только файлы ieee.h и ieee.c.
1
|
||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||
| 26.01.2020, 02:00 [ТС] | ||||||
|
L0M, спасибо за помощь!
да .pro файл это файл Qt который запускается с помощью QMake (наверно его можно назвать аналогом CMake). После удаления из проекта main.cpp и добавления в testieee.c <stdio.h> и <memory.h> (то есть в проекте оставалось два файла testieee.c и ieee.c) я смог успешно запустить проект. Также я переделал объявление функций. Как я понимаю, файл testieee.c создан для тестирования функционирования ieee.c Так как я планирую использовать функционал ieee.c в своем проекте, то я пытаюсь создать пространство имен в заголовочном ibmieee.h файле:
возникают ошибки:ibmieee.h:148:5: error: no matching function for call to 'REVERSE' ibmieee.h:131:10: note: candidate function not viable: no known conversion from 'unsigned long *' to 'char *' for 1st argument Помимо этого, я заметил, что если я файл ieee.c переименую в ieee.cpp, то я получаю такие же ошибки, и мой проект из двух файлов testieee.c и ieee.cpp становится нерабочим. Из-за чего так происходит?
0
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||||||||||||
| 26.01.2020, 02:13 | |||||||||||||
![]() В С нет пространств имен.
1
|
|||||||||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 26.01.2020, 02:29 [ТС] | |
|
DrOffset, буду иметь ввиду, спасибо
не подскажите, почему мы заменили char * intpv на void * intpv? У меня такие же ошибки и для методов ieee2xpt(from,to); xpt2ieee(from,to); пытаюсь понять, мне там по аналогии заменить тип первого аргумента на void?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||
| 26.01.2020, 02:44 | |||
|
В некоторых старых компиляторах С void * был синонимом char *, поэтому этот код работал.
1
|
|||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
||||||||||||||||
| 26.01.2020, 03:26 [ТС] | ||||||||||||||||
|
DrOffset, спасибо, изменил
У меня заголовочный файл выглядит следующим образом:
ошибка: LNK2005: "int __cdecl ibmieee::get_native(void)" (?get_native@ibmieee@@YAHXZ) already defined in main.obj ошибка: LNK2005: "int __cdecl ibmieee::cnxptiee(char *,int,char *,int)" (?cnxptiee@ibmieee@@YAHPEADH0H@Z) already defined in main.obj ошибка: LNK2005: "void __cdecl ibmieee::REVERSE(void *,int)" (?REVERSE@ibmieee@@YAXPEAXH@Z) already defined in main.obj ошибка: LNK2005: "void __cdecl ibmieee::xpt2ieee(unsigned char *,unsigned char *)" (?xpt2ieee@ibmieee@@YAXPEAE0@Z) already defined in main.obj ошибка: LNK2005: "void __cdecl ibmieee::ieee2xpt(unsigned char *,unsigned char *)" (?ieee2xpt@ibmieee@@YAXPEAE0@Z) already defined in main.obj Правильно ли я понимаю, что несколько раз определяю указанные методы? Мне кажется, что определяю я их один раз, а также по одному разу их определяю. Определяю вот так:
main.obj:-1: ошибка: LNK2019: unresolved external symbol "void __cdecl ibmieee::xpt2ieee(char *,char *)" (?xpt2ieee@ibmieee@@YAXPEAD0@Z) referenced in function "int __cdecl ibmieee::cnxptiee(char *,int,char *,int)" (?cnxptiee@ibmieee@@YAHPEADH0H@Z) readsegy.obj:-1: ошибка: LNK2001: unresolved external symbol "void __cdecl ibmieee::xpt2ieee(char *,char *)" (?xpt2ieee@ibmieee@@YAXPEAD0@Z) main.obj:-1: ошибка: LNK2019: unresolved external symbol "void __cdecl ibmieee::ieee2xpt(char *,char *)" (?ieee2xpt@ibmieee@@YAXPEAD0@Z) referenced in function "int __cdecl ibmieee::cnxptiee(char *,int,char *,int)" (?cnxptiee@ibmieee@@YAHPEADH0H@Z) readsegy.obj:-1: ошибка: LNK2001: unresolved external symbol "void __cdecl ibmieee::ieee2xpt(char *,char *)" (?ieee2xpt@ibmieee@@YAXPEAD0@Z) debug\ReadSegy.exe:-1: ошибка: LNK1120: 2 unresolved externals
0
|
||||||||||||||||
|
Мозгоправ
|
|||||||||||||||||||||
| 26.01.2020, 04:40 | |||||||||||||||||||||
Сообщение было отмечено Kerim_Geophysic как решение
Решение
Kerim_Geophysic, как-то мне не понравился ваш код из #13: оформлено вроде как заголовочный файл (.h), а содержимое - реализации функций (как в .cpp). Есть подозрение, что вы не реализовали полностью то, что я вам написал в #8.
Поэтому: ibmieee.h
Я в подробности не вдавался, просто прошёлся напильником, что бы это был код на C++. Компилируется (MS Visual Studio Community 2019, x64, проект в режиме совместимости с MS VS 2017) с уровнем предупреждений Level3 - без предупреждений. Работает:
В другой проект тащите файлы ibmieee.h и ibmieee.cpp. Должно всё работать.
1
|
|||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
|
|
| 26.01.2020, 18:52 [ТС] | |
|
L0M, спасибо большое!
так как Вы написали все работает пытаюсь теперь подстроить код под свою задачу
0
|
|
| 26.01.2020, 18:52 | |
|
Помогаю со студенческими работами здесь
15
Чем отличаются float преобразования (float)var от float(var)
Не происходит конвертация типа int в float invalid types `float[float]' for array subscript Неправильное приведение void* к *float а далее к float Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|