printf (встроенная функция) выводит -nan для чисел с плавающей точкой в Ubuntu 24.10

Вопрос или проблема

У меня две системы: Ubuntu 24.04 и Ubuntu 24.10. Возможно, локали различаются, но это не связано с моей проблемой.

На Ubuntu 24.04:

$ printf "%7d %7.2f %8.3f\n" 123 123.45 45
    123  123.45   45.000

что и ожидалось. Но на Ubuntu 24.10:

$ printf "%7d %7.2f %8.3f\n" 123 123.45 45
    123    -nan     -nan

На обеих системах:

$ type printf
printf это встроенная команда оболочки

Так что это должно быть связано с версией Bash (5.2.21(1) против 5.2.32(1)).

Есть ли кто-то, кто сталкивался с такой же проблемой?

Примечание: /bin/printf похоже работает нормально на обеих системах.

Ответ или решение

При возникновении проблемы с выводом значений -nan при использовании командного встроенного инструмента printf в Bash на системе Ubuntu 24.10, важно рассмотреть несколько аспектов, включая версии Bash, обработки плавающих точек, а также настройки локали.

Суть проблемы

Вы наблюдаете различия в выводе между двумя версиями Ubuntu, где команда printf на Ubuntu 24.04 работает корректно и выводит ожидаемые значения, тогда как на Ubuntu 24.10 вместо этого вы получаете -nan для значений с плавающей запятой. Это указывает на возможные проблемы с обработкой чисел с плавающей запятой в новейшей версии Bash.

Возможные причины

  1. Версия Bash:
    На Ubuntu 24.10 установлена более новая версия Bash (5.2.32), в отличие от 24.04 (5.2.21). Различия в версиях могут касаться не только новых особенностей, но и исправлений, которые могли повлиять на работу встроенных команд, таких как printf.

  2. Форматирование плавающих значений:
    Встроенное printf в Bash может по-разному обрабатывать числа с плавающей запятой, особенно в случае, когда одно или несколько значений не инициализированы должным образом или их вычисление приводит к неопределённому результату (nan — not-a-number).

  3. Локали:
    Хотя вы упомянули, что вероятно это не связано с локалями, все же стоит проверить, какие локали установлены по умолчанию в обеих системах. Различия в локали могут влиять на форматирование чисел, например, использование точки или запятой в качестве десятичного разделителя.

Решения и рекомендации

  1. Использование /bin/printf:
    Поскольку вы отметили, что /bin/printf работает корректно, лучше использовать именно этот вариант для форматирования. Это стандартная реализация printf, которая не имеет зависимостей от версии Bash. Пример использования:

    /bin/printf "%7d %7.2f %8.3f\n" 123 123.45 45
  2. Проверка переменных среды:
    Проверьте, установлены ли переменные среды, такие как LANG и LC_NUMERIC, одинаковыми на обеих системах. Эти переменные могут влиять на поведение программного обеспечения, особенно в контексте чисел с плавающей точкой и их форматирования.

    echo $LANG
    echo $LC_NUMERIC
  3. Обновление системы:
    Если проблема сохраняется, рассмотрите возможность обновления или переустановки Bash на Ubuntu 24.10 для устранения возможных багов в версии 5.2.32.

Заключение

Ошибка формата -nan в выводе printf на Ubuntu 24.10 может быть вызвана рядом факторов, включая изменения в версии Bash и различиями в локалях. Рекомендуется использовать /bin/printf, чтобы избежать подобных проблем, и проверить переменные среды на обоих системах для обеспечения однородности в выводах. Если ситуация не разрешится, рекомендуется обратиться к сообществу разработчиков для получения дополнительной информации о данной версии Bash и возможных багов.

Оцените материал
Добавить комментарий

Капча загружается...