Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
Заблокирован

Double / float в строку и обратно

13.10.2015, 20:48. Показов 5923. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
знаю есть готовые методы, мне просто интересен алгоритм, как это можно реализовать? почему то нигде не найти реализации... в конце концов раз есть библиотечные методы преобразования значит и алгоритм какой то существует...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.10.2015, 20:48
Ответы с готовыми решениями:

Перевести одну строку c float в double
Подскажите. Есть код. Все задано через float. Но 10 VS не вытаскивает одну из строк, и из-за этого необходимо задать все через double, но...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Как обойтись без float, double, long double?
К примеру мне надо в программе использовать что-то вроде -0,00000000000003626686812 и 0,00000000000002072392464. Притом чтобы считалось...

54
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 22:02
Студворк — интернет-сервис помощи студентам
Как ты над ним будешь операции производить?
Надо посмотреть реализацию sprintf().
0
Заблокирован
13.10.2015, 22:02  [ТС]
да вот же оно
Миниатюры
Double / float в строку и обратно  
0
Заблокирован
13.10.2015, 22:11  [ТС]
таким образом у меня вышло что то эдакое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
union DOUBLE_VIEW
{
    double number;
 
    struct
    {
        unsigned char sign : 1;
        unsigned char orger : 7;
        unsigned int mantiss : 23;
    } view;
};
 
int main()
{
    DOUBLE_VIEW dv;
    dv.number = 123.456;
    unsigned char sign = dv.view.sign; // 1
    unsigned char orger = dv.view.orger; // 59
    unsigned int mantiss = dv.view.mantiss; // 6217007
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 22:12
Где там алгоритм перевода?
0
Заблокирован
13.10.2015, 22:14  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Где там алгоритм перевода?
надо еще додумать))
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 22:16
Порядок - это степень, только для двойки, а не для десятки.
0
Заблокирован
13.10.2015, 22:49  [ТС]
я вот все еще думаю над этим и знаете что обнаружил? у меня почему то размер DOUBLE_VIEW - 8 байт, хотя должен быть 4 байта... я даже выравнивание отрубил и все равно... почему так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma pack (push, 1)
union DOUBLE_VIEW
{
    double number;
 
    struct
    {
        unsigned char sign : 1;
        unsigned char orger : 7;
        unsigned int mantiss : 23;
    } view;
};
#pragma pack (pop)
Добавлено через 10 минут
небольшая опечаточка там была 8, а не 7, но размер все равно должен быть 4 байта, это же битовые поля !!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma pack (push, 1)
union DOUBLE_VIEW
{
    double number;
 
    struct
    {
        unsigned char sign : 1;
        unsigned char orger : 8;
        unsigned int mantiss : 23;
    } view;
};
#pragma pack (pop)
что ж за фигня такая
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 22:55
double - 8 байт, откуда там 4?

Добавлено через 42 секунды
А твоя картинка для древнего float.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.10.2015, 22:56
Цитата Сообщение от Volrajas Посмотреть сообщение
знаю есть готовые методы, мне просто интересен алгоритм, как это можно реализовать?
Грамотно - с бубном. Потому как все эти fraction /= 10; дают ошибку округления и по хорошему алгоритм количество этих ошибок должен минимизировать. Скажем, деля не на десять, а сразу на миллиард (одно деление вместо девяти -> одна ошибка вместо девяти).
0
Заблокирован
13.10.2015, 23:05  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
double - 8 байт, откуда там 4?
тьфу ты у меня чето в голове переклинило я забыл, подумал что он 4 байта... да тогда все верно, щас буду додумывать алгоритм

Добавлено через 4 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
А твоя картинка для древнего float.
блин точно... а какие же тогда цифры будут для double? сколько в битах длина порядка и мантиссы?

Добавлено через 2 минуты
и еще, просто из интереса переделал под float, почему у меня теперь размер структуры 6, а не 4? float то уж точно 4 байта...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma pack (push, 1)
typedef union FLOAT_VIEW
{
    float number;
 
    struct
    {
        unsigned char sign : 1;
        unsigned char orger : 8;
        unsigned int mantiss : 23;
    } view;
} FLOAT_VIEW;
#pragma pack (pop)
0
Заблокирован
13.10.2015, 23:18  [ТС]
что то эдакое нарыл, как думаете это оно? 1 / 11 / 52?
Миниатюры
Double / float в строку и обратно  
0
Заблокирован
13.10.2015, 23:20  [ТС]
меня еще вот что волнует в обоих случаях у меня знак все время равен 1, хоть отрицательное хоть положительное число задаю, почему так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma pack (push, 1)
typedef union FLOAT_VIEW
{
    float number;
 
    struct
    {
        unsigned sign : 1;
        unsigned order : 8;
        unsigned mantiss : 23;
    } view;
} FLOAT_VIEW;
 
typedef union DOUBLE_VIEW
{
    double number;
 
    struct
    {
        unsigned long long sign : 1;
        unsigned long long order : 11;
        unsigned long long mantiss : 52;
    } view;
} DOUBLE_VIEW;
#pragma pack (pop)
Добавлено через 35 секунд
и еще раз почему у меня размер FLOAT_VIEW - 6, а не 4?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 23:22
Потому что эта конструкция размещена в памяти не так, как ты ожидаешь.
0
Заблокирован
13.10.2015, 23:24  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Потому что эта конструкция размещена в памяти не так, как ты ожидаешь.
а как она размещена? и почему? я отключил выравнивание сам видишь, что еще может на это повлиять?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2015, 23:28
Как ты определил, что 6? Какой компилятор?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.10.2015, 23:39
А вообще...
C++
1
2
3
4
double X=1.234;
int exp=log10(X);
int64_t M=X/pow(10,exp-15);
cout<<M<<"E"<<exp-15;
Задачу велосипедной печати целого M оставляю в качестве самостоятельного задания.
0
Заблокирован
14.10.2015, 08:22  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Как ты определил, что 6? Какой компилятор?
microsoft visual studio 2015

Добавлено через 1 минуту
вот еще кстати один повод задуматься
C
1
2
3
4
double number = 123.456;
unsigned long long sign = (unsigned long long)number >> 63; // 0
unsigned long long order = ((unsigned long long)number >> 52) & 0x7ff; // 0
unsigned long long mantiss = (unsigned long long)number & 0xffffffff; // 123
Добавлено через 4 минуты
а нет все правильно, я на округление повелся...
C
1
2
3
4
5
double number = 123.456;
unsigned long long nl = *(unsigned long long*)&number;
unsigned long long sign = nl >> 63; // 0
unsigned long long order = (nl >> 52) & 0x7ff; // 1029
unsigned long long mantiss = nl & 0xffffffff; // 446676599
Добавлено через 8 часов 22 минуты
так, а собственно если верить этому
Цитата Сообщение от Barrent Посмотреть сообщение
теоретически нужно из числа с плавающей запятой выделать знак, порядок и мантиссу. Далее мантиссу переводить в строку как обычное целое число, вставлять точку (позиция определяется порядком) и добавлять знак.
то что же получается? если у меня порядок вон за тысячу, и что у меня в числе чтоли тысяча символов? бред же... так как же правильно? что дальше делать получив знак, порядок и мантиссу?

Добавлено через 11 минут
кстати сказать на ideone скомпилировал ради интереса, sizeof(FLOAT_VIEW) == 4, вот и как это понимать? почему у меня тогда 6 отображает?
http://ideone.com/k9xnJD
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 08:51
Цитата Сообщение от Volrajas Посмотреть сообщение
то что же получается? если у меня порядок вон за тысячу, и что у меня в числе чтоли тысяча символов?
Получается что если под мантиссу отведено N бит, то в ней log10(2^n) десятичных разрядов. Все остальное сожрали ошибки округления. Соответственно, печатается log10(2^n) первых знаков десятичной мантиссы, остальное в топку. Что, собственно, в 36 посте и происходит.
0
Заблокирован
14.10.2015, 09:10  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Получается что если под мантиссу отведено N бит, то в ней log10(2^n) десятичных разрядов. Все остальное сожрали ошибки округления. Соответственно, печатается log10(2^n) первых знаков десятичной мантиссы, остальное в топку. Что, собственно, в 36 посте и происходит.
я вообще не понял что происходит в 36 посте, я хочу выяснить все без округления, видишь раз уж битовые поля какую то фигню выдают я сделал все обычными операциями, а вот что дальше мне интересно
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 09:30
Цитата Сообщение от Volrajas Посмотреть сообщение
я вообще не понял что происходит в 36 посте, я хочу выяснить все без округления
Ну так математику учи, разделы "экспоненциальная запись" и "логарифмы". Число хранится в форме мантисса*2^экспонента. Мантисса и экспонента - целые числа. Соответственно, число меняется с шагом 2^экспонента, отсюда и неизбежные ошибки округления. 36 пост же переводит число в более привычную форму мантисса*10^экспонента, утаскивая первые 16 знаков мантиссы в целое число. На остальные знаки пофиг - их съели ошибки округления.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2015, 09:30

float в HEX и обратно
У меня возникли трудности с конвертацией числа типа float (например 2.534) в 4 байта HEX (например строка FFAAFFAA) и обратно. Тип числа...

Преобразование CString->float и обратно
Здравствуйте. Можно ли строку типа CString преобразовать в число типа float (или double) (я уверен, что в строка будет вида 123.123)и...

Double to hex и обратно
Какое бы ни было число в памяти компьютера всё равно оно представлено в виде 0 и 1, как всем известно. Мне нужно преобразовать double в...

Преобразование в float и double
Начал читать книгу Шилдта. В одном из его примеров было показано преобразование типов int в float. Но при компилировании выражения я...

Задание с float и double
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); float fA, fB, fC, fD,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru