Особенности функции atof |
Здравствуйте, гость ( Вход | Регистрация )
Особенности функции atof |
AD |
19.8.2008, 16:27
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Вчера увидел одну немаловажную особенность С-шной функции atof, о которой хотел всех предупредить.
Ну во-первых, функция переводит строковое значение числа в вещественное число. Особенность функции заключается в том, что этот перевод зависит от locale, которое устанавливается функцией setlocale! Например, если в приложении установлено вот так:
Т.е. в данной системе знаковым разделителем будет являться запятая. А если вот так:
Помните об этой особенности, если пользуетесь подобными функциями (не Qt)! |
|
|
void* |
19.8.2008, 19:14
Сообщение
#2
|
Программист-самоучка Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: 3 |
AD, это вполне ясное свойство, т.к. в разных странах свои особенности записи вещественных чисел, поэтому и есть зависимость от локали
Сообщение отредактировал void* - 19.8.2008, 19:15 |
|
|
AD |
19.8.2008, 20:37
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
AD, это вполне ясное свойство, т.к. в разных странах свои особенности записи вещественных чисел, поэтому и есть зависимость от локали я считал эту функцию более интеллектуальной, которая распознает и точку, и запятую, как знаковый разделитель. А оказывается в данном случае за этим приходиться следить программисту. |
|
|
Litkevich Yuriy |
20.8.2008, 5:21
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
AD, это вполне ясное свойство, т.к. в разных странах свои особенности записи вещественных чисел, поэтому и есть зависимость от локали а по мне дак это чушь полная, т.к. в исходном коде программ десятичный разделитель всегда был точкой! И от того что я живу в России, я не пишу в исходном коде число Пи как в обычном тексте (3,14), я пишу так: 3.14 |
|
|
Tonal |
20.8.2008, 13:30
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
А при чём тут исходный код?
Эта функция для преобразования строки в число с плавающей точкой. А строку можно и из файла прочитать и с терминала ввести. Какой там будет разделитель - зависит от того кто вводит - а он вводит то, что привык. У нас принята (в школах обучают, в документах печатают) как раз запятая. Но в связи с повсеместным распространением кривых программ, которые не учитывают локаль, сейчас часто используют и точку и запятую. По мне, так нужно как можно более чётко придерживаться именно стандартов локализации. А не пытаться нарисовать универсальную функцию, которая бы с помощью искусственного интеллекта распознавала бы число в любой форме. Сообщение отредактировал Tonal - 20.8.2008, 13:34 |
|
|
Litkevich Yuriy |
20.8.2008, 13:39
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Tonal, для случая с переменной передаваемой в эту функцию, соглашусь. Но если ты константу пишешь, как в примере AD, то получается большой касяк.
И в школе нас на уроке информатики учили, что в компьютерах десятичный разделитель = точка. Лично для меня подобное поведение, именно как в примере AD, было бы большим сюрпризом. И попробуй представить кросс-какой-нибудь вариант такого кода. Дай вариант исходника с запятой американцу пущай скомпилит себе программку |
|
|
Tonal |
20.8.2008, 13:57
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Ну так в исходнике можно и напрямую числовым литералом записать.
Для числовых литералов в С/С++ стандарт чётко оговаривает использование точки. Зачем извращаться-то? Да и atof откуда узнает как строку была получена? А на уроке информатики вам "В компьютерах" десятичный разделитель зависит от требований программы с какой ты работаешь. Есть системы где десятичный разделитель жёстко специфицирован - например исходники распространённых языков программирования, разные среды, отладчики. Там где нужна совместимость и переносимость в текстовом виде. Здесь считается что пользователь должен быть достаточно подготовлен. А есть, наоборот, где зависит от локали - это домашние и офисные приложения, где пользователь должен как можно быстрее и проще включится в работу. А некоторые приложения должны уметь настраиваться. Например если в генераторе отчётов нельзя настроить десятичный разделитель, то это плохой, не годный генератор. Сообщение отредактировал Tonal - 20.8.2008, 14:01 |
|
|
Litkevich Yuriy |
20.8.2008, 14:37
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А на уроке информатики вам лапшу навесили сказали не полную правду. а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт. не знаю как сейчас на уроках информатики, может ориентир на виндовоз, и его использование. |
|
|
Tonal |
21.8.2008, 10:59
Сообщение
#9
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт. Они не были ориентированы на широкого пользователя или на работу с документами. К тому же большинство программного обеспечения тогда было либо стянуто, либо наскоро адаптированно. В той же MSDOS нормальная поддержка русского в консоле дай бог если в 5ке появилась. Но это скорее к политике и развалу науки и промышленности относится, чем к самим машинам. не знаю как сейчас на уроках информатики, может ориентир на виндовоз, и его использование. Причём тут винда-то? Нормальные настройки окружения для работы пользователя. Читать для начала: http://ru.wikipedia.org/wiki/%D0%9B%D0%BE%...%B0%D0%BB%D1%8C http://ru.wikipedia.org/wiki/%D0%9B%D0%BE%...%86%D0%B8%D1%8F http://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%86%D0%B8%D1%8F |
|
|
AD |
21.8.2008, 22:16
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Они не были ориентированы на широкого пользователя или на работу с документами. К тому же большинство программного обеспечения тогда было либо стянуто, либо наскоро адаптированно. В той же MSDOS нормальная поддержка русского в консоле дай бог если в 5ке появилась. Но это скорее к политике и развалу науки и промышленности относится, чем к самим машинам. Причём тут винда-то? Нормальные настройки окружения для работы пользователя. а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт. Я многое пропустил, блин. У меня сегодня целый день на форуме темы не открывались! Я не совсем понял, о чем спор-то? Лично по мне, так я не считаю удобным то, что программисту приходится следить за тем, что поставлено: точка или запятая. Мне кажется, что надо бы было сделать функцию так, чтобы она понимала оба этих разделителя одновременно. ПЛЮС ко всему, могу заметить следующее: года 2 или 3 назад при делании лабораторок заметил еще одну штуку: функции типа sprintf делают строки именно с точкой, а не с запятой. не проверял эту штуку, используя setlocale, но думаю, результат будет тем же! |
|
|
Текстовая версия | Сейчас: 3.1.2025, 12:23 |