pengujian/pemilih int64 cepat ditulis untuk mengembalikan nilai dalam kisaran [-2⁶²,2⁶²).
Itu kesalahan; memperbaikinya adalah #19808.
Tetapi kode harus berjalan seperti yang tertulis, namun pada Nexus 9 @ dr2chase
menjalankan toolchain linux/arm64 yang dibuat dari toolchain android/arm64
dikompilasi silang dari tempat lain, secara empiris menghasilkan nilai di luar
kisaran itu. (Itu membantu menemukan #19807.)
Menggunakan toolchain linux/arm64 yang dibuat dari toolchain linux/arm64
dikompilasi silang dari tempat lain di Odroid berfungsi dengan benar.
Sebelum memperbaiki pengujian/cepat untuk menghasilkan rentang penuh, kita harus mencari
tahu mengapa kode saat ini menghasilkan nilai di luar rentang yang lebih sempit
dalam konfigurasi ini.
matematika/rand (*Rand).Int63 mengatakan:
return r.src.Int63()
dan (*rngSource).Int63 mengatakan:
return int64(rng.Uint64() & _MASK)
di mana:
const (
_MAX = 1 << 63
_MASK = _MAX - 1
)
dan kemudian menguji/fungsi randInt64 cepat melakukan:
return rand.Int63() - 1<<62
Jadi & _MASK
atau - 1<<62
tidak melakukan tugasnya.
Bisa jadi hardware Nexus 9 ARM64 bermasalah.
Bisa jadi toolchain android/arm64 digunakan untuk
bootstrap pada Nexus 9 bermasalah, menyebabkan kompilasi asli
linux/arm64 toolchain menjadi buggy, menyebabkan pengujian/cepat
kode untuk menghasilkan nilai yang tidak terduga. Kami tidak tahu.
CL https://golang.org/cl/39152 menyebutkan masalah ini.
Program C berikut melakukan kesalahan pada sistem yang bermasalah.
#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;
}
Setelah iterasi 20k-50k, loop mulai mencetak i pada setiap iterasi.
Bukan salah Go. Kita akan melihat tentang pelaporan ini di tempat lain.
CL https://golang.org/cl/39310 menyebutkan masalah ini.
Komentar yang paling membantu
Program C berikut melakukan kesalahan pada sistem yang bermasalah.
Setelah iterasi 20k-50k, loop mulai mencetak i pada setiap iterasi.
Bukan salah Go. Kita akan melihat tentang pelaporan ini di tempat lain.