Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. Конвертация строки в число.
Поиск данных по Вашему запросу:
Схемы, справочники, даташиты:
Прайс-листы, цены:
Обсуждения, статьи, мануалы:
Содержание:
- Преобразовать строку в число
- Arduino String – работа со строками в ардуино
- Перевод string в int
- Функция atoi
- Как преобразовать std :: string в int?
- Описание функций языка Си
- Строки и потоки ввода-вывода C++
- Функции преобразования данных
Строки в C++ - 5 примеров преобразования строки в целое число или число с плавающей точкой в Python
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: C++ урок. Перевод из строки в число
Логин или эл. Войти или Зарегистрироваться. Авторизация Логин или эл. Преобразуем в строку. Часть 1. Целые числа. Алгоритмы и программные решения. Задача преобразования числа в строку стоит всегда, когда нужно отобразить числовые результаты работы программы. Процессоры у нас оперируют двоичными данными, человеку-же подавай десятичные числа. Собственно задача состоит в преобразовании базы числа.
Какие для этого есть способы? Целью данной статьи является описание и сравнение максимального количества способов преобразования числа в строку. Задачу, естественно, рассматриваем с точки зрения реализации на микроконтроллерах, по этому размер и скорость имеют значение. Для простоты рассматриваем только без-знаковые х и ти разрядные числа со знаком не намного сложнее.
Но вот беда, sprintf это ведь функция форматированного вывода, которая много чего умеет и тянет за собой много другие функций стандартной библиотеки. Размер машинного кода при ее использовании увеличивается значительно. Вообще эти функции не стандартные, ног часто имеются в наличии и, в отличии от sprintf, не делают ничего лишнего.
Извлечение цифр делением на Готовые стандартные и не очень способы посмотрели. Теперь пришло время свои велосипеды изобретать. Первый самый очевидный способ это конечно деление на 10 и вычисление остатка в цикле. Всё вроде просто красиво, ничего лишнего, но есть одно но. Собственно деление, да еще и вычисление остатка.
Если в процессоре нет аппаратного деления, то это очень медленно. Извлечение цифр делением на 10 с помощью функции div Может попробовать использовать стандартную функцию div, которая возвращает сразу частное и остаток? К преимуществам этого и предыдущего метода можно отнести то, что они могут преобразовывать число в строку по любому основанию если ёх чуть доработать , не обязательно Деление на 10 сдвигами и сложениями.
Если у целевого процессора нет аппаратной поддержки х разрядного деления, то предыдущие два метода будут довольно медленными. Деление на 10 можно заменить на серию сдвигов и сложений. Сначала умножаем исходное число на 0. Очень удобно, что дробь периодическая и удалось обойтись всего пятью сдвигами и четырьмя сложениями.
Далее делим то, что получилось на 8, сдвигая на 3 разряда вправо. Получается исходное число делённое на 10 с точностью до единицы из-за ошибок округления.
После находим остаток умножая полученное частное на 10 и вычитая его из исходного числа. Если остаток больше 9, то корректируем его и частное. Вычитание степеней Еще один популярный способ преобразования числа в строку, заключается в последовательном вычитании из исходного числа степеней 10, начиная с максимальной. Потом переходим на меньшую степень И так пока не доберёмся до 1.
Цифры получаются сразу в нужном порядке, нужно только удалить ведущие нули. Методы на двоично-десятичных числах. Следующие три метода основаны на операциях с упакованными двоично-десятичными числами — binary coded decimals BCD. В этом представлении каждая тетрада 4 бита хранит одну десятичную цифру. В х разрядной переменной можно таким образом хранить 8 десятичных цифр.
В двоичном представлении в 2-х разрядной переменной 10 десятичных цифр. Поэтому эти методы дают урезанные результаты для чисел больше А потом к каждой тетраде значение которой оказалось больше 9 нужно добавить корректирующее число 6 с переносом бита в старшую тетраду. И к каждой тетраде из которой был перенос бита в старшую тетраду, нужно также добавить корректирующее число 6.
Все остальные строки функции — как раз эта коррекция. В третей строка складываем наши два числа. В четвёртой — выделяем младшие биты переноса для каждой тетрады. В остальных — прибавляем 6 к тем тетрадам из которых был перенос бита. Вот так вот — без единого условного перехода. Сложение степеней двойки. Сложение степеней двойки с таблицей. В предыдущем методе используется два сложения двоично-десятичных чисел. А вот если добавлять эту лишнюю единицу ко второму аргументы, то результат будет уже не правильным.
Количество итераций в цикле этого метода всегда будет равно разрядности числа, в отличии от предыдущих, где цикл закончится, как только в числе не останется единичных бит. Извлечение цифр умножением на Идея заключается в том, что десятичные цифры можно извлекать со стороны старших бит числа и использовать умножение на 10 для перехода к следующему десятичному разряду. Для этого придётся представить наше двоично число как дробную часть, мысленно перенести запятую на сколько-то разрядов влево, в нашем случае это будет После этого биты начиная с 27 разряда будут содержать старшую десятичную цифру.
Если оно было больше, то две цифры со значением не более Это надо учесть. Еще один момент — это переполнение. А как-же всё-таки умножить челое число на 1. Всё так-же сдвиками и сложениями. Если кто-нибудь видел этот способ раньше — скажите мне, а то я могу претендовать на авторство. Как видно при умножении пришлось использовать ка битную арифметику — дополнительный байт для дробной части.
Если дробную часть отбросить и использовать х битную арифметику, то возникают ошибки округления, который достигают 7 для больших чисел. Для эффективного использования бита переноса можно использовать ассемблерные вставки.
Поскольку первая тестируемая платформа у нас будет avr-gcc, для него их и напишем, чисто ради спортивного интереса. Для методов разных типов время работы будет зависеть от разных факторов, например для методов основанных на делении на 10 время будет зависеть в большей степени от количества десятичных цифр, о есть от абсолютной величины числа и очень мало от самих этих цифр.
Вычитание степеней 10 в цикле будет тем быстрее работать чем меньше сумма десятичных цифр составляющих число. То есть обработается гораздо быстрее чем Методы основанные на двоично-десятичных числах будут быстрее работать если в исходном числе мало единичных бит — быстрее всего со степенями двойки. Время работы последнего метода будет зависеть только от абсолютной величины преобразуемого числа, но в меньшей степени чем методы с делением на Итак в наборе для тестирования должны быть маленькие чила, большие числа, степени двойки, степени десяти, числа где много девяток.
Всякие тесты для AVR удобно проводить на симуляторе Simulavr — не нужно никакого железа, и многочисленных перепрошивок. Для замера времени выполнения наших функций воспользуемся ти разрядным таймером, тикающем на частоте ядра. Вывод на консоль через отладочный порт эмулятора. Оптимизация кода максимальная по скорости. Лидирует в этом бенчмарке с не большим отрывом метод на быстром делении на 10 сдвигами и сложениями.
К нему близко подобралось вычитание степеней Следом метод с умножением на Время выполнения метода Хорнера практически не зависит от конвертируемого числа. Худший результат теперь у sprintf, ведь внутри она всё равно использует разрядные числа.
Результаты для MSP Все функции разумеется в него не помещаются, по этому заливаются и тестируются по одной с помощью скрипта. Как видно честное деление здесь почти вдвое медленнее чем у AVR. Обсуждение результатов Аутсайдером везде является функция использующая библиотечную функцию деления div. Несмотря на то, что она возвращает за один вызов и остаток и частное от деления, даже на STM32 аппаратным делением, она реализована программно и работает очень медленно.
Очевидно этот способ использовать не стоит. Дело в том, что хитрый GCC при делении на константу использует хитрый трюк — заменяет деление на умножение на константу такую, что старшие 32 бита в 64 разрядном произведении, содержат исходное делимое, делённое на Это практически безусловный лидер по скорости и часто имеет вполне скромный размер. Этот метод всегда удачный выбор. Вобщем, тоже не плохой выбор.
Методы основанные на двоично десятичных числах работают не очень быстро, имеют не самый маленький размер и к тому-же выдают только 8 цифр результата в моей реализации, можно получить все 10 цифр, но будет еще медленнее.
Их лучше использовать не для преобразования двоичных чисел в строки, а для преобразования двоичных чисел в упакованные двоично десятичные, для последующей работы сними.
Аргумент str означает строку, представленную в виде массива символов, содержащего символы знакового целого тип int числа. Когда atoi получает строку без числовых последовательностей, то в этом случае возвращает ноль 0. Строка должна начинаться или непосредственно с числовой последовательности, или с любого сочетания пробельных символов. После обработки числовой последовательности любой нечисловой остаток строки если он есть игнорируется.
Чтобы подставить это число в форумулу, вам придётся его конвертировать в строку.
Войти или зарегистрироваться. Искать только в заголовках Сообщения пользователя: Имена участников разделяйте запятой. Новее чем: Искать только в этой теме Искать только в этом разделе Отображать результаты в виде тем. Быстрый поиск. Кто нибудь сталкивался с такой проблемой? Иван С , 1 июн Естественно выдает ошибку. Используйте atoi или sscanf. Unixon , 1 июн
Она может считывать данные всех базовых типов и автоматически конвертировать их в нужный внутренний формат. Если бы printf выполняла ввод, а не вывод, ее можно было бы назвать аналогом scanf. Спецификаторы формата следуют за символом процент и сообщают scanf , данные какого типа будут считаны следующими. Коды спецификаторов приведены в таблице.
Функция atoi преобразует строку string в целое значение типа int. Анализируя строку string , atoi интерпретирует её содержание, как целое число, которое возвращается как int.
Если можно, поясни более точно, какое значение ты вкладываешь в слово «додать»? Вообще простые мат. Вообще-то да поправят меня люди более умные , в переменных shell овских скриптов читай переменных окружения всегда хранятся только текстовые строки. Поэтому то что выдаёт awk текстовую строку можешь смело подавать на вход expr. А вообще выложи скрипт и сообщения об ошибках, которые выдаёт скрипт при исполнении.
Иногда требуется преобразовать строку в целое число или в число с плавающей точкой для осуществления определённых операций в Python. В Python можно использовать функции int и float для преобразования строки в целое число или число с плавающей точкой до осуществления каких-либо операций. Можно использовать класс float для преобразования строки в число с плавающей точкой. Замечание: если вы попытаетесь использовать здесь функцию int , то получите ошибку. Если нужно преобразовать строки из чисел, содержащиеся в списке, тогда используйте генератора списков. Аналогичным образом можно использовать float вместо int для преобразования списка, содержащего строки из целых чисел. Рассмотрим пример:. Если попытаетесь преобразовать ее, используя функции int или float , то получите ошибку.
Если нужно перевести число в строку на си (char *), то лучше всего # include void main(){ char str[11]; int number = ; sprintf(str, «%d».
Корректная запись целого числа состоит из следующих частей:. Допустимый набор цифр для 2-ричной системы счисления — 01 , для 3-ичной — и так далее, начиная с ричной системы счисления в диапазон допустимых цифр входят латинские буквы от Aa до Zz для ричной системы счисления. В этом случае регистр букв не имеет значения.
Если вы дочитали мою книгу до этой главы, знайте — в вас начинает просыпаться настоящий программист! Ведь основаня черта настоящего программиста — упорство! Я возводил у вас на пути скучные листинги, строил заборы из математических форумул, ударялся в теорию. Как нам помогают строки? КАК узнать длину строки?
Среди всего спектра программного обеспечения, которое было разработано или же разрабатывается в настоящее время, вы вряд ли сможете найти сколь бы то ни было значимое число, не использующих текстовую информацию. Какие-то программы используют текст только для отображения названия элементов, другие являются приложениями для составления текстов, третьи принимают на вход один текст, а на выходе дают другой — вариантов ПО масса.
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum yandex. Обязательно пройдите активизацию e-mail. Конвертация типа string в int. Подскажите пожалуйста как конвертировать тип string из string. Например SomeStr. Mixasik Посмотреть профиль Найти ещё сообщения от Mixasik. Sazary Посмотреть профиль Найти ещё сообщения от Sazary.
Используя наш сайт, вы подтверждаете, что прочитали и поняли политику о куки , политику конфиденциальности и пользовательское соглашение. Stack Overflow на русском — это сайт вопросов и ответов для программистов. Регистрация займёт не больше минуты.
dasdas |
| ||
28/09/13 |
| ||
| |||
ewert |
| |||
11/05/08 |
| |||
| ||||
dasdas |
| |
28/09/13 | ||
| ||
Aritaborian |
| ||
11/06/12 |
| ||
| |||
Tod Leben |
| ||
09/05/10 |
| ||
| |||
alien308 |
| ||
06/08/09 |
| ||
| |||
mustitz |
| ||
10/04/12 |
| ||
| |||
Показать сообщения за: Все сообщения1 день7 дней2 недели1 месяц3 месяца6 месяцев1 год Поле сортировки АвторВремя размещенияЗаголовокпо возрастаниюпо убыванию |
Страница 1 из 1 | [ Сообщений: 7 ] |
Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы
Функции для форматирования чисел по стандартам СИ.
Пример использования:
из si_prefix import si_format распечатать si_format (.5) # 500,0 м (точность по умолчанию равна 1) напечатать si_format(.01331, точность=2) # 13,31 м распечатать si_format(1331, точность=2) # 1,33 тыс. распечатать si_format(1331, точность=0) # 1к
\N{MICRO SIGN}
) для
обозначать
микро (не ты). si_parse
функцияАвтор Кристиан Фобель [email protected]
Перенесено из версии C автор Юкка «Юкка» Корпела
Поддержка Python 3: olehermanse
Этот проект лицензируется в соответствии с условиями BSD 3-пункт лицензия
si_префикс.
CRE_SI_NUMBER
= объект <_sre.SRE_Pattern по адресу 0x2fe76c0> Изменено в версии 1.0: Используйте строку Unicode для единицы СИ для поддержки символа микро (т. е. µ).
См. также
Выпуск №4.
si_префикс.
SI_PREFIX_UNITS
= u’yzafpn\xb5m kMGTPEZY’ Изменено в версии 1.0: Определите как строку Unicode и используйте µ (т. е. \N{MICRO SIGN}
, \x0b5
)
для обозначения микро (не u).
См. также
Выпуск №4.
Сообщение на форуме, в котором обсуждается юникод на примере µ.
Отчет Бюро Международной системы единиц (СИ) Интернешнл де Поид и Мер
si_префикс.
префикс
( expof10 )[источник]Параметры: | expof10 – Показатель степени числа 10, связанный с единицей СИ характер. |
---|---|
Возвраты: | Один из символов в «yzafpnum kMGTPEZY». |
Тип возврата: | стр |
si_префикс.
si_format
( значение , точность=1 , format_str=u'{значение} {префикс}’ , exp_format_str=u'{значение}e{expof10}’ )[источник] 9007Форматировать значение в строку с префиксом SI, используя указанную точность.
Параметры: |
|
---|---|
Возвращает: | |
Тип возврата: | Юникод |
Примеры
Например, с точностью =2 :
1e-27 --> 1.00e-27 1,764e-24 --> 1,76 г 7.4088e-23 --> 74,09 г 3.1117e-21 --> 3.11 г 1,30691e-19 --> 130,69 г 5,48903e-18 --> 5,49 а 2,30539е-16 --> 230,54 а 9,68265e-15 --> 9,68 f 4,06671e-13 --> 406,67 f 1.70802e-11 --> 17,08 р 7,17368e-10 --> 717,37 р 3.01295e-08 --> 30,13 н 1.26544e-06 --> 1,27 у 5.31484e-05 --> 53,15 у 0,00223223 --> 2,23 м 0,0937537 --> 93,75 м 3,93766 --> 3,94 165,382 --> 165,38 6946,03 --> 6,95 к 291733 --> 291,73 к 1,22528e+07 --> 12,25 М 5,14617e+08 --> 514,62 М 2,16139e+10 --> 21,61 г 9,07785e+11 --> 907,78 г 3,8127e+13 --> 38,13 Т 1,60133e+15 --> 1,60 П 6,7256е+16 --> 67,26 П 2,82475e+18 --> 2,82 в.д. 1,1864e+20 --> 118,64 в.д. 4,98286e+21 --> 4,98 Z 2,0928e+23 --> 209,28 Z 8,78977e+24 --> 8,79 Д 3,6917e+26 --> 369,17 Д 1,55051e+28 --> 15,51e+27 6,51216e+29 --> 651,22e+27
Изменено в версии 1. 0: Используйте строку Unicode для format_str
и строку формата значения SI для
поддерживать микросимволы (т. е. µ) и изменять тип возвращаемого значения на unicode
нить.
См. также
Выпуск №4.
si_префикс.
si_parse
( значение )[источник]Разобрать значение, выраженное с использованием единиц префикса СИ, в число с плавающей запятой.
Параметров: | значение ( str или unicode ) — Значение, выраженное с использованием единиц префикса SI (как возвращается si_format() функция). |
---|
Изменено в версии 1.0: Используйте строку Юникода для единицы СИ для поддержки микросимвола (т. е. µ).
См. также
Выпуск №4.
si_префикс.
si_prefix_expof10
( si_unit )[источник]Параметры: | si_unit ( str ) – символ единицы СИ, т. е. один из «yzafpnµm kMGTPEZY». |
---|---|
Возвращает: | Показатель степени десяти, связанный с si_unit , например, 3 для si_unit=k и -6 для si_unit=µ . |
Тип возвращаемого значения: | целое число |
si_префикс.
si_prefix_scale
( si_unit )[источник]Параметры: | si_unit ( str ) – символ единицы СИ, т.е. один из «yzafpnµm kMGTPEZY». |
---|---|
Возвращает: | Несколько, связанных с si_unit , например, 1000 для si_unit=k . |
Тип возвращаемого значения: | целое число |
si_префикс.
разделить
( значение , точность=1 )[источник]Разделить значение на значение и «показатель степени 10», где «показатель степени 10» — это кратно 3. Это соответствует префиксам СИ.
Возвращает кортеж, где второе значение представляет собой «показатель степени 10», а первое значение равно . Значение , деленное на «показатель степени 10».
Параметры: |
|
---|---|
Возвращает: | Второе значение — это показатель степени 10, а первое значение — значение разделить на «показатель степени 10». |
Тип возврата: | кортеж |
Примеры
si_prefix.split(0.04781) -> (47.8, -3) si_prefix.split(4781.123) -> (4.8, 3)
См. si_format()
для получения дополнительных примеров.
Читать документы v: последний
Бесплатный хостинг документов предоставляется Read the Docs.
Функция SIP2NUM преобразует строку с префиксом SI (он же метрический префикс или инженерный префикс) в числовое значение. Например, строка «1 k» преобразуется в 1000. Бонусная функция BIP2NUM преобразует строку с двоичным префиксом в числовое значение, например, значение «1 Ki» преобразуется в 1024.
Протестировав множество представлений на MATLAB FEX (см. Благодарности) и не найдя ни одного, который бы правильно преобразовывал все значения, я написал свои собственные функции. А затем тщательно проверил их, чтобы подтвердить, что они действительно дают правильный результат.
Эта отправка:
Обратное преобразование
Для преобразования числовой строки в строку с префиксом:
http://www. mathworks.com/matlabcentral/fileexchange/33174-number-to-scientific-prefix
Примеры префикса SI
>> sip2num(’10k’) % ИЛИ sip2num(‘10.0 kilo’) ИЛИ sip2num(‘10000’) ИЛИ sip2num(‘1e4’)
ans = 10000
>> [num ,spl] = sip2num(«Мощность: 200 мегаватт»)
num = 200000000
spl = [«Мощность: «,»ватт»]
>> [num,spl,sgf] = sip2num(«от -3.6 СН до +1,24 кВ разность потенциалов.»)
число = [-3600000,1240]
spl = [«от «,»В до «,»разность потенциалов В.»]
sgf = [2,3] 94
ans =
Примеры двоичных префиксов
>> bip2num(’10 Ki’) % ИЛИ bip2num(‘10.0 kibi’) ИЛИ bip2num(‘10240’) ИЛИ bip2num(‘1.024e4’) 90 10240
>> [num,spl] = bip2num(«Память: 200 мегабайт»)
num = 209715200
spl = [«Память: «,»byte»]
>> [num,spl,sgf] = bip2num(«Допуск данных от -3,6 МБ до +1,24 КБ.»)
num = [-3774873,6,1269,76]
spl = [«От «,»B до «,»Допуск данных B.»] 98 | Йи | yobi
Примечания
Эти функции были тщательно протестированы во многих пограничных случаях, при этом особое внимание уделялось обеспечению правильной обработки экспоненциальной записи.