LINUX.ORG.RU
ФорумTalks

Как вывести число в С?

 


0

5

Берем код, который использует обсуждаемые расширения gcc, стандарт C23, который не так давно появился, и пока плохо поддерживается компиляторами:

#include <complex.h>

int main() {
    constexpr signed _BitInt(142) _Complex A = 1 + 3 * I;
}
BitInt отвечает за количество бит в числе, Complex это значит что у нас комплексное число, а I это мнимая единичная константа.

У к вам сразу несколько вопросов: 1) как бы вы вывели переменную 2) можете ли вы уверенно предположить какой код это сгенерирует 3) как бы вы описали интерфейс extern «C» в Rust для вызова функции которая возвращает этот тип

★★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 3)

А разве _Complex может быть _BitInt?

int _Complex — unspecified behavior, может отличаться от компилятора к компилятору и, в общем случае, не обязано компилироваться (например, icc скажет, что _Complex can only be used with float, double, extended or long double types).

как бы вы вывели переменную

Each complex type has the same object representation and alignment requirements as an array of two elements of the corresponding real type (float for float complex, double for double complex, long double for long double complex). The first element of the array holds the real part, and the second element of the array holds the imaginary component.

sjinks ★★★
()
Ответ на: комментарий от sjinks

Если бы _Complex мог быть _BitInt, то представление зависит от ABI. Например, для x86-64:

  • For N <= 64, they have the same size and alignment as the smallest of (signed and unsigned) char, short, int, long and long long types that can contain them.
  • For N > 64, they are treated as struct of 64-bit integer chunks. The number of chunks is the smallest number that can contain the type. _BitInt(N) types are byte-aligned to the next greatest power-of-2 up to 64 bits. The size of these types is the smallest multiple of the 64-bit chunks greater than or equal to N. The value of the unused bits beyond the width of the _BitInt(N) value but within the size of the _BitInt(N) are unspecified when stored in memory or register.

Тогда signed _BitInt(142):

struct signed_bitint_142 {
    uint64_t p1;
    uint64_t p2;
    uint64_t p3;
};

А signed _BitInt(142) _Complex был бы массивом из двух элементов struct signed_bitint_142. В MSVC все сложнее, да и хрен с ним.

sjinks ★★★
()

жуть какая. они так из Си сделают C++

Shushundr ★★★★
()

Про расширения и C23 ничего не знаю, но

как бы вы вывели переменную

Надо писать конвертор из этого типа в строку и печатать строку.

можете ли вы уверенно предположить какой код это сгенерирует

«Это» это что?

как бы вы описали интерфейс extern «C» в Rust для вызова функции которая возвращает этот тип

Никак.

firkax ★★★★★
()
Ответ на: комментарий от BceM_IIpuBeT

Это какэта не словам к чертям совместимость?

thunar ★★★★★
()

Нормально, я буквально на днях писал свой BigFloat в основе которого лежит свой BigInt сделанный на std::array<uint64_t, blocks>. Надо будет измерить производительность

Reset ★★★★★
()

Посмотрел исходный код gcc - в качестве чисел используются массивы и обычный «школьный» алгоритм умножения.

Reset ★★★★★
()

Никак, ругнётся оно платформенной ошибкой для 142>128. Если я правильно понимаю логику этого нового _BitInt в стандарте.

snizovtsev ★★★★★
()
Ответ на: комментарий от snizovtsev

_BitInt на 128+ битов поддерживает и gcc и clang.

MOPKOBKA ★★★★★
() автор топика

Я бы взял для такой фигни GMP или uBLAS какой-нибудь. Тем более если нужно взаимодействие с другими языками.

no-such-file ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)