Nie mogę użyć __uint128_t, dlaczego?

0

Cześć. Próbuję zdeklarować zmienną __uint128_t, ale nie jest to możliwe w moim Code Blocks. Pobrałem gcc stąd: https://jmeubank.github.io/tdm-gcc/ i ustawiłem ścieżkę w zmiennych środowiskowych do folderu bin.

Nic to nie dało. __int128_t r jest wyświetlane jako zwykły ciąg znaków, a nie deklaracja zmiennej i dostaję błąd ""uint128_t does not name a type". Co może być przyczyną?

0

A kompiluje sie?

Zacznij od zmiany codeblocks na jakis przyzwoity edytor/IDE :)
VS Code, CLion albo Visual Studio

EDIT: a nie to nie jest po prostu __int128?

1

Nie widzę, żeby GCC obsługiwało samo z siebie __uint128_t, co najwyżej unsigned __int128https://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html

0

Program się kompiluje:

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <chrono>

//unsigned __int128 r;

uint64_t LCG(uint64_t LCG_state)
{
    LCG_state = (LCG_state * 2862933555777941757 + 1422359891750319841);
    return LCG_state;
}

int main()
{
auto begin = std::chrono::high_resolution_clock::now();

    double a = 0;
    uint64_t LCG_state = 333;
    uint32_t result;

    for(int i=0; i<100; i++)
    {
    auto begin = std::chrono::high_resolution_clock::now();
    for(int i=0; i<640000000; i++)
    {
        LCG_state = LCG(LCG_state);
        result = LCG_state >> 32;
        //std::cout << wynik << "\n";
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    printf("Time measured: %.3f seconds.\n", elapsed.count() * 1e-9);
    a = a + (elapsed.count() * 1e-9);
    }
__asm__ volatile("" : "+g" (result) : :);
std::cout << a/100;
}



Ale próba zadeklarowania unsigned __int128 r pokazuje błąd expected unqualified-id before '__int128'.

0

OS Windows 11, MSYS2, kompilator w wersji 11.2
Po odkomentowaniu linii z __int128 nadal się kompiluje

0

Wszystkie symbole o globalnym scope, które zaczynają się od podwójnego undersocre są zarezerwowane dla kopilatora (ergo nie wolno ich też definiować) i nie powinny być używane.

https://stackoverflow.com/a/29638843/1387438

Może boost: boost::int128_t?

0
Tomasz_D napisał(a):

Program się kompiluje:

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <chrono>

//unsigned __int128 r;

uint64_t LCG(uint64_t LCG_state)
{
    LCG_state = (LCG_state * 2862933555777941757 + 1422359891750319841);
    return LCG_state;
}

int main()
{
auto begin = std::chrono::high_resolution_clock::now();

    double a = 0;
    uint64_t LCG_state = 333;
    uint32_t result;

    for(int i=0; i<100; i++)
    {
    auto begin = std::chrono::high_resolution_clock::now();
    for(int i=0; i<640000000; i++)
    {
        LCG_state = LCG(LCG_state);
        result = LCG_state >> 32;
        //std::cout << wynik << "\n";
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    printf("Time measured: %.3f seconds.\n", elapsed.count() * 1e-9);
    a = a + (elapsed.count() * 1e-9);
    }
__asm__ volatile("" : "+g" (result) : :);
std::cout << a/100;
}



Ale próba zadeklarowania unsigned __int128 r pokazuje błąd expected unqualified-id before '__int128'.

Co ty tak naprawdę próbujesz zrobić?
Bo z tego kodu widać parę rzeczy:

2

Jak potrzebujesz 128-bitowych liczb, to użyj po prostu Boost.MultiPrecision. Z odpowiednim backendem powinno być wydajnie.

0
vpiotr napisał(a):

https://quick-adviser.com/are-there-any-128-bit-processors/

@vpiotr: ale procesor nie musi być N-bitowy żeby kompilator udostępniał N-bitowe inty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1