1000,000 1000 সি হিসাবে 1000,000,000 লেখেন কেন?


142

অ্যাপল দ্বারা তৈরি কোডে, এই লাইনটি রয়েছে:

CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )

1,000,000,000হিসাবে প্রকাশ করার কোনও কারণ আছে 1000*1000*1000?

কেন 1000^3এই বিষয়টির জন্য নয়?


45
কোডের স্পষ্টতা এবং পাঠযোগ্যতা। আপনি সি বা বিভাজক হিসাবে রাখতে পারবেন না, সুতরাং পরবর্তী সেরা জিনিসটি গুণনের থেকে মানটি গণনা করা। C সি-তে একটি সম্পর্কিত নয় অপারেটর exclusive
আইভিলনোটেক্সিস্ট আইডোনোটেক্সবাদ

54
এটি বিশেষত: 2 * 60 * 60 এর মতো সময়সীমার জন্য ব্যবহৃত হয় .. এটি সহজেই লক্ষ্য করা যায় যে 2 ঘন্টার জন্য ...
ইডালি

53
একের জন্য আমি সন্দেহ করি যে 10,000,000,000 বৈধ বাক্য গঠন নয়
পাপারাজ্জো

15
উপায় দ্বারা, আধুনিক প্রোগ্রামিং ভাষার বিকল্প পথ সুইফট একই, যেমন লিখতে হবে 1_000_000_000। যাইহোক, সময় স্থিরীর সাথে এটি আরও কঠিন। এটি লেখার 30 * 60চেয়ে বেশি পঠনযোগ্য (30 সেকেন্ডে 30 মিনিট) 1800। আসলে এমন ভাষা রয়েছে যা আপনাকে ইউনিট লেখার অনুমতি দেবে, উদাহরণস্বরূপ meters, খারাপ কাজ থেকে নিজেকে রক্ষা করতে দেয়।
সুলতান

29
^একটি এক্সওআর, কোনও এক্সপোনেন্ট বা পাওয়ার অপারেটর নয়।
ডিভে

উত্তর:


200

একটি গুণকে ধ্রুবক হিসাবে ঘোষণা করার এক কারণ হ'ল পাঠযোগ্যতার উন্নতি করা, যখন রান-টাইম পারফরম্যান্স প্রভাবিত হয় না। এছাড়াও, ইঙ্গিত দেওয়ার জন্য যে লেখক সংখ্যাটি সম্পর্কে বহুগুণে ভাবছিলেন।

এই বিবেচনা:

double memoryBytes = 1024 * 1024 * 1024;

এটি এর থেকে পরিষ্কারভাবে ভাল:

double memoryBytes = 1073741824;

যেহেতু পরের দিকে নজর নেই, প্রথম নজরে 1024 এর তৃতীয় শক্তি।

আমিন নেগম-আওয়াদ ^যেমন উল্লেখ করেছেন, অপারেটরটি বাইনারি XOR। অনেক ভাষায় অন্তর্নির্মিত, সংকলন-সময় এক্সপেনসিয়েশন অপারেটরের অভাব রয়েছে, সুতরাং গুণটি।


13
এবং যে ভাষাগুলিতে একটি ক্ষতিকারক অপারেটর রয়েছে, এটি অগত্যা '^' নয়। ফরট্রানে, উদাহরণস্বরূপ, এটি '**'।
জামেস্কেফ

4
: আপনি একটি লিঙ্ক গুরুত্বপূর্ণ সতর্কীকরণ নির্দেশ, নীচের উত্তরে দেওয়া @chux থেকে অন্তর্ভুক্ত করা উচিত stackoverflow.com/a/40637622/1841533 (ওপি বাঁধা বিশেষ করে "C", যা এই 'righ সরাসরি খুব সমর্থ হয় পার্শ্ব ক্রিয়াকলাপে সমস্ত শর্তগুলি একটি ছোট প্রকারের মধ্যেই সীমাবদ্ধ রয়েছে বলে মনে হয় এবং গুণাগুণটি 'প্রবহর'কে উপচে পড়তে পারে)। Safecoding.cert.org/confluence/display/c/… সাধারণ ক্ষেত্রে যারা এড়াতে সহায়তা করতে পারে?
অলিভিয়ার ডুলাক

4
এছাড়াও আমাদের লক্ষ্য করা উচিত যে সংকলনের সময় গণনা করা হয়। সি স্ট্যান্ডার্ডটির প্রয়োজন হয় ভাষার বিভিন্ন বৈশিষ্ট্যের জন্য সংকলন সময়ে ধ্রুবক অভিব্যক্তি গণনা করতে সক্ষম হওয়া এবং আমরা উদাহরণস্বরূপ যখন একটি ধ্রুবক অভিব্যক্তি ব্যবহার করা হয় তখন আমরা এটি নিরাপদে ধরে নিতে পারি।
ইউআহ

13
দ্বিগুণ হিসাবে মেমরি সঞ্চয় পরিমাণ? এটিকে ত্রুটির সম্ভাব্য উত্স মনে হয়।
জ্যাব

7
@ সুপের্যাট আমি এটি সম্পর্কে অবহিত, তবে দ্বিগুণ ব্যবহার করে আপনার ক্ষেত্রে এমন একটি ঘটনা ঘটতে পারে যেখানে বলুন যে আপনি মেমরির পরিসরের একটি অংশ চান, আপনি xসাব্র্যাঞ্জের আকার পেতে ভাগ করে নিলেন ... এবং হঠাৎ আপনার একটি ভগ্নাংশ হবে বাইট, যার জন্য ক্ষতিপূরণ দিতে অতিরিক্ত যুক্তির প্রয়োজন হতে পারে।
জেএবি

73

না কেন 1000^3?

ফলাফলটি 1000^31003 ^the বিট-এক্সওআর অপারেটর।

এমনকি এটি কিউ নিজেই মোকাবেলা করে না, আমি একটি স্পষ্টতা যোগ করি। x^yএটি সর্বদা প্রশ্নকারীর উদাহরণে যেমন মূল্যায়ণ করে নাx+y । আপনি প্রতিটি বিট xor করতে হবে। উদাহরণের ক্ষেত্রে:

1111101000 (1000₁₀)
0000000011 (3₁₀)
1111101011 (1003₁₀)

কিন্তু

1111101001 (1001₁₀)
0000000011 (3₁₀)
1111101010 (1002₁₀)

3
স্যার, আমি 1003 ^ 3 1003 কীভাবে স্পষ্ট তা জানি না Google গুগল এবং ম্যাক ক্যালকুলেটরটি 1000 ^ 3 = 1,000,000,000 দেখায়। তুমি কি ব্যাখ্যা করতে পারো?
মহেশ

57
^সি / সি ++ / উদ্দেশ্য সি ইত্যাদি ক্যালকুলেটর এটি সাধারণত এর অর্থ এক্স টু দ্যা Y ক্ষমতায় অপারেটর উপায়ে XOR যাও।
তমস জহোলা

5
বাহ, 1000 এবং 3 এর বিটগুলি ওভারল্যাপ হয় না। এটি দেখতে খুব ভুল দেখাচ্ছে।
ইয়াক্ক - অ্যাডাম নেভ্রামাউন্ট

19
বিটগুলি ওভারল্যাপ করে। তবে 1 এর নয়। : -]
আমিন নেগম-আওয়াদ

6
@ ইয়াক্ক: সত্যই, এটি এতটা ভুল দেখাচ্ছে! ... আমি আশা করি অনেক লোক "A ^ B" সর্বদা A + B দেয় না বলে মনে করবে না (তবে আমি আশঙ্কা করি কিছু হতে পারে ...)
অলিভিয়ার ডুলাক

71

ব্যবহার না করার কারণ রয়েছে 1000 * 1000 * 1000

16-বিট সহ int, 1000 * 1000উপচে পড়া। সুতরাং ব্যবহারের 1000 * 1000 * 1000ফলে বহনযোগ্যতা হ্রাস।

32-বিট সহ int, নিম্নলিখিত কোডের প্রথম লাইনটি ওভারফ্লো হয়।

long long Duration = 1000 * 1000 * 1000 * 1000;  // overflow
long long Duration = 1000000000000;  // no overflow, hard to read

পরামর্শ দিন যে সীসার মানটি পাঠযোগ্যতা, বহনযোগ্যতা এবং নির্ভুলতার জন্য গন্তব্যের ধরণের সাথে মেলে ।

double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;

eমান হিসাবে হুবহু উপস্থাপনযোগ্য জন্য সাধারণ ব্যবহার স্বরলিপিও পারে double। অবশ্যই এটি জানা থাকলে বাড়েdouble এটি পুরো সংখ্যাটির মানটি সঠিকভাবে উপস্থাপন করতে - 1e9 এর চেয়ে বেশি মানের সাথে উদ্বেগের কিছু। (দেখুন DBL_EPSILONএবং DBL_DIG)

long Duration = 1000000000;
// vs.
long Duration = 1e9;

5
খুব গুরুত্বপূর্ণ মন্তব্য! Safecoding.cert.org/confluence/display/c/… অনেক ক্ষেত্রে সাহায্য করতে পারে?
অলিভিয়ার ডুলাক

2
একটি doubleহ'ল 2 ^ 53 ≈ 9e15 অবধি সমস্ত পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে।
এডগার বোনেট

3
@ অ্যাডগারবোনেট সত্য যে বাইনারি 64 প্রায় 9e15 পর্যন্ত পুরো সংখ্যাটি উপস্থাপন করতে পারে। তবে সি doubleসাধারণত বাইনারি 64 এর ব্যবহার নির্দিষ্ট করে না যদিও এটি খুব সাধারণভাবে ব্যবহৃত হয়। সি স্পেস অনুযায়ী, 1e9 বা আরও বেশি অবধি মানগুলি যথাযথভাবে উপস্থাপনযোগ্য। আপনি যদি অনুশীলনের জন্য কোড করতে চান বা সাধারণ অভ্যাসের উপর নির্ভর করতে চান তবে এটি নির্ভর করে।
chux

4
উভয় @Patrick 1000এবং 1000000000000হয় ধ্রুবক পূর্ণসংখ্যা । প্রতিটি স্বতন্ত্রভাবে টাইপ নির্বাচন করা হয়েছে int, longবা long long। সংকলকটি 3 টির মধ্যে প্রথম ধরণের ব্যবহার করে যেখানে পূর্ণসংখ্যার ধ্রুবক ফিট করে। 1000 * 1000 * 1000 * 1000সঙ্গে সম্পন্ন করা হয় intপ্রতিটি যেমন গণিত 1000একটি ইন int। পণ্যটি 32-বিট দিয়ে উপচে পড়েছে int1000000000000 অবশ্যই long long(বা সম্ভবত সংকীর্ণ) হিসাবে উপস্থাপনযোগ্য - কোনও ওভারফ্লো নয়। লক্ষ্য ধরণ long long Durationএই detemrination "= ডান দিকে" প্রভাবিত করে না।
chux - মনিকা পুনরায় ইনস্টল করুন

2
বৃহত্তর প্রকারকে প্রথমে স্থাপন করা গুরুত্বপূর্ণ। 16-বিট সহ int, long x = 1000 * 1000 * 1000L;উপচে পড়বে, যখন long x = 1000L * 1000 * 1000;হবে না।
প্রাক্তন নিহিলো

51

পাঠযোগ্যতার জন্য।

জিরো ( 1 000 000 000বা 1,000,000,000) এর মধ্যে কমা এবং স্পেস স্থাপন করা একটি সিনট্যাক্স ত্রুটি তৈরি করবে এবং 1000000000কোডটিতে থাকা ঠিক কতটি জিরো আছে তা দেখতে অসুবিধা হয়।

1000*1000*1000এটি স্পষ্ট করে তোলে যে এটি 10 ​​^ 9, কারণ আমাদের চোখ খণ্ডগুলি আরও সহজেই প্রক্রিয়া করতে পারে। এছাড়াও, কোনও রানটাইম ব্যয় নেই, কারণ সংকলক ধ্রুবকের সাথে এটি প্রতিস্থাপন করবে 1000000000


5
এফওয়াইআই, আমি সম্প্রতি ডিজিটর বিভাজক সম্পর্কে ধারণা পেয়েছি। জাভা কিছুক্ষণের জন্য এটি পেয়েছে এবং সি # 7.0 এটি পেতে পারে। আমি আশা করি সমস্ত ভাষায় এই চোখ-ক্যান্ডি বৈশিষ্ট্যটি থাকবে। :)
iheartchaharp

1
প্রসঙ্গে উপর নির্ভর করে 1,000,000,000সিনট্যাক্স ত্রুটি তৈরি করে না, এর অর্থ অন্য কিছু। উদাহরণস্বরূপCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
রস রিজ

2
@ জেএমএস 10 সি ইতিমধ্যে এটি রয়েছে যদি আপনি ভিএস 15 প্রিভিউ সংস্করণ ইনস্টল করেন তবে এই হিসাবে লেখা যেতে পারে1_000_000_000
user1306322

2
পাইথন হচ্ছে _খুব, বিভাজক হিসেবে :)
ওয়েন ভের্নার

2
এবং সি ++ সম্প্রতি 'সি ++ 14 এ বিভাজকটি পেয়েছে , যাতে আপনি ব্যবহার করতে পারেন 1'000'000'000। (এটি বেছে নেওয়া হয়েছিল কারণ 1,000,000,000কমা অপারেটর বা 4 টি স্বতন্ত্র প্যারামিটার হিসাবে ভুল ব্যাখ্যা করা যেতে পারে এবং _1_000_000_000এটি একটি বৈধ (তবে সম্ভবত খারাপ) পরিবর্তনশীল নাম))
জাস্টিন সময় - মনিকা পুনরায়

27

পাঠযোগ্যতার জন্য। তুলনা করার জন্য, জাভা _পাঠযোগ্যতা উন্নত করতে সংখ্যায় সমর্থন করে (প্রথম ডেরেক ফস্টারের প্রস্তাবটির উত্তর হিসাবে স্টিফেন কোলবর্ন প্রস্তাবিত : প্রজেক্ট কয়েন / জেএসআর 334 এর জন্য বাইনারি লিটারালস )। 1_000_000_000এখানে একটি লিখতে হবে ।

মোটামুটি কালানুক্রমিক ক্রমে, পুরানো সমর্থন থেকে নতুন পর্যন্ত:

ভাষার পক্ষে তাদের সমর্থন করা উচিত (এবং তারপরে পার্ল রয়েছে) বুঝতে এটি তুলনামূলকভাবে নতুন বৈশিষ্ট্য relatively Chux @ এর দুর্দান্ত উত্তরে 1000*1000...যেমন একটি আংশিক সমাধান তবে চূড়ান্ত ফলাফলটি একটি বৃহত প্রকারের হলেও প্রগতিটি বহুগুণে প্রবাহিত হতে বাগগুলিতে প্রোগ্রামার খোলে।


অনেক আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজে একই রকম থাকে, যেমন সুইফ্ট। নতুন কিছুই নেই.
সুলতান

আফাইক, এটি পার্ল থেকে এসেছে। পিএল / এম, একই উদ্দেশ্যে $ ব্যবহৃত উদাহরণ: 0100 $ 0010B
ninjalj

1
এটা তোলে হয় মোটামুটি নতুন, যদিও। জাভা বৈশিষ্ট্যটি সম্ভবত 5 বছরের পুরানো। এই বাক্য গঠনটিকে সমর্থনকারী বেশিরভাগ অন্যান্য ভাষা বেশ নতুন - সুইফট নিজেই কয়েক বছরের পুরানো। পাইথন 3.6-এ সমর্থন যোগ করে, যা এখনও প্রকাশ করা হয়নি।
জনসিপ

2
অ্যাডা এখন 33 বছর ধরে পূর্ণসংখ্যার আক্ষরিক ক্ষেত্রে আন্ডারলাইনগুলিকে সমর্থন করেছে।
পিটার - মনিকা পুনরায়

1
@ জেজেচলিন: আমি প্রায় কালানুক্রমিকভাবে আরও তথ্য যুক্ত করার স্বাধীনতা নিয়েছি। আমার আগে ভুল হয়েছিল, প্রজেক্ট কয়েন থ্রেড দ্বারা বিচার করে, স্টিফেন কুলবার্ন সম্ভবত ফ্যানডম এবং / বা রুবির কাছ থেকে পূর্ণসংখ্যার লিটারালগুলিতে আন্ডারস্কোরের ধারণা নিয়েছিলেন। রুবি সম্ভবত পার্লের কাছ থেকে, এবং আদার কাছ থেকে এই ধারণাটি নিয়েছিল।
নিনজালজ

7

1,000,000,000ফর্মের সাথে কিছু সমিতি পড়তে এবং পেতে আরও সহজ হতে পারে ।

প্রযুক্তিগত দিক থেকে আমি অনুমান করি যে সরাসরি সংখ্যা বা গুণনের মধ্যে কোনও পার্থক্য নেই। সংকলক যাইহোক এটিকে ধ্রুব বিলিয়ন সংখ্যা হিসাবে উত্পন্ন করবে।

আপনি যদি উদ্দেশ্য-সি সম্পর্কে কথা বলেন, তবে 1000^3কাজ করবে না কারণ পাউয়ের জন্য এমন কোনও সিনট্যাক্স নেই (এটি xor)। পরিবর্তে, pow()ফাংশন ব্যবহার করা যেতে পারে। তবে সেক্ষেত্রে এটি সর্বোত্তম হবে না, এটি একটি রানটাইম ফাংশন কল হবে যা সংকলক উত্পন্ন ধ্রুবক নয়।


3

নিম্নলিখিত পরীক্ষার প্রোগ্রামটি বিবেচনা করার কারণগুলি চিত্রিত করতে:

$ cat comma-expr.c && gcc -o comma-expr comma-expr.c && ./comma-expr
#include <stdio.h>

#define BILLION1 (1,000,000,000)
#define BILLION2 (1000^3)

int main()
{
        printf("%d, %d\n", BILLION1, BILLION2);
}
0, 1003
$

1
@pjvandehaar আমি উইকিপিডিয়া নিবন্ধগুলি পড়ে কোনও ভাষা শেখার পরামর্শ দেব না।
পিটার - মনিকা

0

দশমিক সংখ্যার জন্য সি তে অনুরূপ প্রভাব অর্জনের আরেকটি উপায় হ'ল আক্ষরিক ভাসমান বিন্দু স্বরলিপি ব্যবহার করা - যতক্ষণ না কোনও ডাবল কোনও সংখ্যক নির্ভুলতার ক্ষতি ছাড়াই আপনি যে সংখ্যাটি চান তা উপস্থাপন করতে পারে।

আইইইই 754 64-বিট ডাবল কোনও সমস্যা ছাড়াই কোনও অ-নেতিবাচক পূর্ণসংখ্যাকে <= 2 ^ 53 উপস্থাপন করতে পারে। সাধারণত, দীর্ঘ ডাবল (80 বা 128 বিট) এর চেয়ে আরও বেশি যেতে পারে। রূপান্তরগুলি সংকলনের সময়ে সম্পন্ন হবে, সুতরাং কোনও রানটাইম ওভারহেড নেই এবং যথাযথতার অপ্রত্যাশিত ক্ষতি হয়ে থাকলে এবং আপনার একটি ভাল সংকলক থাকলে আপনি সম্ভবত সতর্কতা পেতে পারেন।

long lots_of_secs = 1e9;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.