আমি সবসময় চিন্তা র্যান্ডম সংখ্যা, শূন্য এবং এক মধ্যে মিথ্যা বলব ছাড়া1
, IE তারা অর্ধ খোলা বিরতি [0,1) থেকে নম্বর আছে। এর cppreferences.com এর ডকুমেন্টেশন এটিstd::generate_canonical
নিশ্চিত করে।
যাইহোক, যখন আমি নিম্নলিখিত প্রোগ্রামটি চালিত করি:
#include <iostream>
#include <limits>
#include <random>
int main()
{
std::mt19937 rng;
std::seed_seq sequence{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
rng.seed(sequence);
rng.discard(12 * 629143 + 6);
float random = std::generate_canonical<float,
std::numeric_limits<float>::digits>(rng);
if (random == 1.0f)
{
std::cout << "Bug!\n";
}
return 0;
}
এটি আমাকে নিম্নলিখিত ফলাফল দেয়:
Bug!
অর্থাৎ এটি আমাকে একটি নিখুঁত উত্পন্ন করে 1
, যা আমার এমসি সংহতকরণে সমস্যা সৃষ্টি করে। এটি বৈধ আচরণ বা আমার পক্ষে কোনও ত্রুটি আছে? এটি জি ++ 4.7.3 এর সাথে একই আউটপুট দেয়
g++ -std=c++11 test.c && ./a.out
এবং ঝাঁকুনি 3.3
clang++ -stdlib=libc++ -std=c++11 test.c && ./a.out
যদি এটি সঠিক আচরণ হয় তবে আমি কীভাবে এড়াতে 1
পারি?
সম্পাদনা 1 : গিট থেকে জি ++ একই সমস্যাতে ভুগছে বলে মনে হচ্ছে। আমিও আছি
commit baf369d7a57fb4d0d5897b02549c3517bb8800fd
Date: Mon Sep 1 08:26:51 2014 +0000
এবং সংকলন ~/temp/prefix/bin/c++ -std=c++11 -Wl,-rpath,/home/cschwan/temp/prefix/lib64 test.c && ./a.out
একই আউটপুট দেয়, ldd
ফলন দেয়
linux-vdso.so.1 (0x00007fff39d0d000)
libstdc++.so.6 => /home/cschwan/temp/prefix/lib64/libstdc++.so.6 (0x00007f123d785000)
libm.so.6 => /lib64/libm.so.6 (0x000000317ea00000)
libgcc_s.so.1 => /home/cschwan/temp/prefix/lib64/libgcc_s.so.1 (0x00007f123d54e000)
libc.so.6 => /lib64/libc.so.6 (0x000000317e600000)
/lib64/ld-linux-x86-64.so.2 (0x000000317e200000)
2 সম্পাদনা করুন : আমি আচরণটি এখানে রিপোর্ট করেছি: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63176
3 সম্পাদনা করুন : ঝনঝন দলটি সমস্যাটি সম্পর্কে সচেতন বলে মনে হচ্ছে: http://llvm.org/bugs/show_bug.cgi?id=18767
abs(random - 1.f) < numeric_limits<float>::epsilon
ফলাফলগুলি 1.0 এর কাছাকাছি থাকলে চেকগুলি ব্যবহার করে আপনার উদাহরণ , যা এই প্রসঙ্গে পুরোপুরি ভুল: এখানে ০.০ এর কাছাকাছি সংখ্যা রয়েছে যা এখানে বৈধ ফলাফল, যেমন, সমস্তগুলি যা 1.0 এর চেয়ে কম।
1.f == 1.f
সব ক্ষেত্রেই লাইভলি (সমস্ত ক্ষেত্রে কী আছে? আমি কোনও ভেরিয়েবলও দেখতে পাইনি1.f == 1.f
; এখানে কেবল একটিই মামলা রয়েছে:1.f == 1.f
এবং তা সর্বদা অবিচ্ছিন্নtrue
)। দয়া করে এই কল্পকাহিনীটি আরও ছড়িয়ে দেবেন না। ভাসমান পয়েন্টের তুলনা সর্বদা নির্ভুল।