crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Особенности функции atof
AD
  опции профиля:
сообщение 19.8.2008, 16:27
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вчера увидел одну немаловажную особенность С-шной функции atof, о которой хотел всех предупредить.
Ну во-первых, функция переводит строковое значение числа в вещественное число. Особенность функции заключается в том, что этот перевод зависит от locale, которое устанавливается функцией setlocale! Например, если в приложении установлено вот так:
setlocale(LC_ALL, ".ACP");
// тогда
double d = atof("0.4"); // d =0.0
double d1 = atof("0,4"); // d1 =0.4

Т.е. в данной системе знаковым разделителем будет являться запятая.
А если вот так:
setlocale(LC_ALL, 0);
// тогда
double d = atof("0.4"); // d =0.4
double d1 = atof("0,4"); // d1 =0.0


Помните об этой особенности, если пользуетесь подобными функциями (не 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  


Цитата(void* @ 19.8.2008, 20:14) *
AD, это вполне ясное свойство, т.к. в разных странах свои особенности записи вещественных чисел, поэтому и есть зависимость от локали :)

я считал эту функцию более интеллектуальной, которая распознает и точку, и запятую, как знаковый разделитель. А оказывается в данном случае за этим приходиться следить программисту.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.8.2008, 5:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(void* @ 19.8.2008, 23:14) *
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  


Цитата(Tonal @ 20.8.2008, 17:57) *
А на уроке информатики вам лапшу навесили сказали не полную правду.

а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт.

не знаю как сейчас на уроках информатики, может ориентир на виндовоз, и его использование.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 21.8.2008, 10:59
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 20.8.2008, 18:37) *
а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт.

Они не были ориентированы на широкого пользователя или на работу с документами. К тому же большинство программного обеспечения тогда было либо стянуто, либо наскоро адаптированно.
В той же MSDOS нормальная поддержка русского в консоле дай бог если в 5ке появилась.
Но это скорее к политике и развалу науки и промышленности относится, чем к самим машинам.

Цитата(Litkevich Yuriy @ 20.8.2008, 18:37) *
не знаю как сейчас на уроках информатики, может ориентир на виндовоз, и его использование.

Причём тут винда-то?
Нормальные настройки окружения для работы пользователя.
Читать для начала:
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  


Цитата(Tonal @ 21.8.2008, 11:59) *
Они не были ориентированы на широкого пользователя или на работу с документами. К тому же большинство программного обеспечения тогда было либо стянуто, либо наскоро адаптированно.
В той же MSDOS нормальная поддержка русского в консоле дай бог если в 5ке появилась.
Но это скорее к политике и развалу науки и промышленности относится, чем к самим машинам.
Причём тут винда-то?
Нормальные настройки окружения для работы пользователя.

Цитата(Litkevich Yuriy @ 20.8.2008, 18:37) *
а на тод период, я не припомню чтоб были компы использующие запятую для этих целей. у нас были два типа Крвет (БК-0010) и Нейва (БК-0011). Да и Редкие ПиСюки и Искры тоже были таковыми, тоже работали только с точкой. Так что факт.

Я многое пропустил, блин. У меня сегодня целый день на форуме темы не открывались! Я не совсем понял, о чем спор-то? :)

Лично по мне, так я не считаю удобным то, что программисту приходится следить за тем, что поставлено: точка или запятая. Мне кажется, что надо бы было сделать функцию так, чтобы она понимала оба этих разделителя одновременно. ПЛЮС ко всему, могу заметить следующее: года 2 или 3 назад при делании лабораторок заметил еще одну штуку: функции типа sprintf делают строки именно с точкой, а не с запятой. не проверял эту штуку, используя setlocale, но думаю, результат будет тем же! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 22:47