2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Язык С, scanf и long double
Сообщение13.07.2018, 16:57 
Как с помощью функции scanf прочитать число типа long double в языке C ?
Содержательные попытки решения задачи:
Используется синтаксис C
scanf("%lf", &x);
считывает число типа double, но не long double. Кроме того проверены варианты: %Lf, %lF, %LF, %llf, %LLF - не помогают

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 17:05 
А что говорит документация?

-- Пт июл 13, 2018 19:10:00 --

Судя по всему, она говорит, что %Lf должно работать. Так что непонятно, почему у вас не сработало.

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 18:06 
Аватара пользователя
SpiderHulk в сообщении #1326531 писал(а):
считывает число типа double, но не long double

а между ними есть разница?

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 18:11 
Аватара пользователя
Geen в сообщении #1326543 писал(а):
а между ними есть разница?
Да, double обычно 64-битный, а long double - 80-битный.

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 18:14 
Аватара пользователя
mihaild в сообщении #1326547 писал(а):
Geen в сообщении #1326543 писал(а):
а между ними есть разница?
Да, double обычно 64-битный, а long double - 80-битный.

Не обязательно.

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 18:17 
Аватара пользователя
Geen в сообщении #1326549 писал(а):
Не обязательно.
mihaild в сообщении #1326547 писал(а):
обычно

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 18:18 
Аватара пользователя
https://en.wikipedia.org/wiki/Long_double

и вопрос-то был конкретно про случай ТС...

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 21:40 
arseniiv в сообщении #1326532 писал(а):
%Lf должно работать

И тем не менее не работает, точнее работает да не так как надо. Пытаясь вводить разные числа я обнаружил что в переменную $x$ всегда заносится значение $1,13303e-317$

===================================

Возможно дело в компиляторе Dew-C++, он предназначен, как следует из названия, для С++, а я пытаюсь писать на нём программы используя только средства языка С

-- 13.07.2018, 21:55 --

В компилятора Pelles C $%Lf$ в $scanf$ работает, вот только long double ничем не отличается от просто double

 
 
 
 Re: Язык С, scanf и long double
Сообщение13.07.2018, 22:08 
SpiderHulk в сообщении #1326570 писал(а):
Dew-C++
Да, дело в нём, но не в том, что он плюсовый. Среда Dev-C++ использует gcc (часть MinGW) в качестве компилятора и майкрософтовскую рантайм-библиотеку. Они имеют разные взгляды на размер long double, что и влечёт означенную проблему. То есть это известный баг MinGW. На stackoverflow предлагают решение: #define __USE_MINGW_ANSI_STDIO перед #include <stdio.h>.

 
 
 
 Re: Язык С, scanf и long double
Сообщение03.01.2019, 03:03 
Я тоже долго мучился над этим. Заработало:
long double myld;
printf("Enter long double myld: ");
scanf("%Lf", &myld);
printf("myld = %Lg\n", myld);

Программа выдает:

Enter long double myld: 1,28e-1024
myld = 1,28e-1024

Система программирования CodeBlocks
Дополнительно установленный компилятор: MinGW64
Опция компиляции: -m64
Выяснил, кроме того, что sizeof(long double) = 16;
LDBL_MAX = 1,18973e+4932.
Битовое представление максимального: 7ffeffffffffffffffff,
т.е. 80 бит. Это значит что 128 бит занимает только с целью выравнивания.
Процессор Intel оперирует правающим типом в 80 бит.

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group