Go: cmd/compile: тСстированиС/быстрыС ошибки Π½Π° Nexus 9 linux/arm64

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 31 ΠΌΠ°Ρ€. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: golang/go

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ int64 testing/quick написан Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ значСния Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [-2⁢², 2⁢²).
Π­Ρ‚ΠΎ ошибка; ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это # ​​19808.

Но ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ написано, ΠΈ всС ΠΆΠ΅ Π½Π° Nexus 9 @dr2chase
запуск Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ инструмСнтов linux/arm64, созданной ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ инструмСнтов android/arm64
кросс-компилируСтся ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ мСста, эмпиричСски ΠΎΠ½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ значСния Π²Π½Π΅
этот Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. (Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ #19807.)

ИспользованиС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ инструмСнтов linux/arm64, созданной ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ инструмСнтов linux/arm64.
кросс-ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ мСста Π½Π° Odroid Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

ΠŸΠ΅Ρ€Π΅Π΄ исправлСниСм тСстирования/быстрого создания ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ
Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ значСния Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ·ΠΊΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°
Π² этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

math/rand's (*Rand).Int63 Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

return r.src.Int63()

ΠΈ (*rngSource).Int63 Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

return int64(rng.Uint64() & _MASK)

Π³Π΄Π΅:

const (
    _MAX  = 1 << 63
    _MASK = _MAX - 1
)

Π° Π·Π°Ρ‚Π΅ΠΌ функция тСстирования/быстрого randInt64 выполняСт:

return rand.Int63() - 1<<62

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π»ΠΈΠ±ΠΎ & _MASK , Π»ΠΈΠ±ΠΎ - 1<<62 Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ обСспСчСниС Nexus 9 ARM64 содСрТит ошибки.
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°Π±ΠΎΡ€ инструмСнтов android/arm64 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для
Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° Nexus 9 содСрТит ошибки, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ скомпилированный
Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° linux/arm64 содСрТит ошибки, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ/быстрому
ΠΊΠΎΠ΄ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠœΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° C Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ систСмС.

#include <stdio.h>

typedef unsigned long long uvlong;

uvlong f() { return ~0ull; }
uvlong g() { return (f() << 1) >> 1; }

int main() {
    for (int i = 0;; i++) {
        if ((long long)g() < 0) {
            printf("%d\n", i);
        }
    }
    return 0;
}

ПослС 20-50 тысяч ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ» Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ i Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

НС Π²ΠΈΠ½Π° Π“ΠΎ. ΠœΡ‹ посмотрим, ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС.

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

CL https://golang.org/cl/39152 ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° C Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ систСмС.

#include <stdio.h>

typedef unsigned long long uvlong;

uvlong f() { return ~0ull; }
uvlong g() { return (f() << 1) >> 1; }

int main() {
    for (int i = 0;; i++) {
        if ((long long)g() < 0) {
            printf("%d\n", i);
        }
    }
    return 0;
}

ПослС 20-50 тысяч ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ» Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ i Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

НС Π²ΠΈΠ½Π° Π“ΠΎ. ΠœΡ‹ посмотрим, ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС.

CL https://golang.org/cl/39310 ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ