Тип quadmath и аргумента для scanf

Я использую <quadmath.h>, С каким типом аргумента я могу правильно прочитать свои данные? Если я использую double, это выглядит так:

printf("enter 3 values for s, t and mt:\n");
scanf("%lf %lf %lf", &s, &t, &mt);
printf("%lf %lf %lf\n", s, t, mt);

Я пробовал разные возможности вместо "l", например:

scanf("%Qf %Qf %Qf", &s, &t, &mt);

или даже без

 scanf("%f %f %f", &s, &t, &mt);

однако я получаю ошибку.

2 ответа

Решение

scanf (и связанные функции и printf и связанные функции) не является расширяемым. Он может только анализировать то, о чем знает стандартная библиотека. Стандартная библиотека C поставляется с операционной системой, а не с компилятором. Он не знает о libquadmath, который является расширением компилятора.

Таким образом, вам придется читать строки и конвертировать их отдельно, используя strtoflt128,

Обратите внимание, что потоки C++ могут быть расширены для извлечения __float128, но я не вижу интерфейс C++ в библиотеке quadmath.

Вы не можете использовать %Qf спецификатор в scanf, вы должны ввести числа высокой точности в виде строки, а затем использовать strtoflt128 преобразовать. Вы также не можете использовать %Qf спецификатор в printfиспользовать quadmath_snprintf для преобразования __float128 число с плавающей точкой в ​​строку, затем используйте printf с %s спецификатор для отображения. Вот пример.

#include <stdio.h>
#include <quadmath.h>
int main()
{
        char s[256], t[256], mt[256];
        printf("enter 3 values for s, t and mt:\n");
        scanf("%s %s %s", s, t, mt);
        __float128 qs = strtoflt128(s, NULL);

        __float128 qt = strtoflt128(t, NULL);

        __float128 qmt = strtoflt128(mt, NULL);

        quadmath_snprintf(s, 256, "%Qf", qs);

        quadmath_snprintf(t, 256, "%Qf", qt);

        quadmath_snprintf(mt, 256, "%Qf", qmt);

        printf("%s %s %s", s, t, mt);
        return 0;
}

запустить программу:

введите 3 значения для s, t и mt:
3,4 4,5 5,6(введите)
3.400000 4.500000 5.600000

Другие вопросы по тегам