تم كتابة محدد int64 للاختبار / سريع لإرجاع القيم في النطاق [-2⁶²، 2⁶²).
هذا خطأ. تحديد هذا هو # 19808.
ولكن يجب تشغيل الكود كما هو مكتوب ، ومع ذلك على جهاز Nexus 9 الخاص بـ @ dr2chase
تشغيل سلسلة أدوات linux / arm64 التي تم إنشاؤها من android / arm64 toolchain
تم تجميعها من مكان آخر ، وتولد قيمًا من الخارج بشكل تجريبي
هذا النطاق. (ساعد ذلك في العثور على رقم 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 المستخدمة من أجل
bootstrap على Nexus 9 عربات التي تجرها الدواب ، مما تسبب في تجميع ملفات
سلسلة أدوات لينكس / arm64 لتكون عربات التي تجرها الدواب ، مما تسبب في الاختبار / سريع
كود لتوليد قيم غير متوقعة. لا نعلم.
يذكر 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 ألفًا ، تبدأ الحلقة في الطباعة على كل تكرار.
خطأ لا تذهب. سنرى حول الإبلاغ عن هذا في مكان آخر.
يذكر CL https://golang.org/cl/39310 هذه المشكلة.
التعليق الأكثر فائدة
برنامج C التالي يسيء التصرف في النظام الإشكالي.
بعد التكرارات من 20 إلى 50 ألفًا ، تبدأ الحلقة في الطباعة على كل تكرار.
خطأ لا تذهب. سنرى حول الإبلاغ عن هذا في مكان آخر.