গো-তে কোনও প্রকারের জন্য সর্বাধিক মান


132

একটি unsignedপূর্ণসংখ্যার ধরণের জন্য উপস্থাপনযোগ্য সর্বোচ্চ মান কীভাবে নির্দিষ্ট করে ?

আমি জানতে চাই minযে নীচের লুপটিতে কীভাবে আর্ট্রাইজ করা যায় তা পুনরুক্তিভাবে কয়েকটি স্ট্রাক্ট থেকে ন্যূনতম এবং সর্বাধিক দৈর্ঘ্যের গণনা করে।

var minLen uint = ???
var maxLen uint = 0
for _, thing := range sliceOfThings {
  if minLen > thing.n { minLen = thing.n }
  if maxLen < thing.n { maxLen = thing.n }
}
if minLen > maxLen {
  // If there are no values, clamp min at 0 so that min <= max.
  minLen = 0
}

যাতে তুলনার মধ্য দিয়ে প্রথমবার minLen >= n


2
এই স্নিপেট একটি কটাক্ষপাত করা int(^uint(0) >> 1) // largest intথেকে নিষ্কাশিত golang.org/doc/effective_go.html#printing
ভিক্টর

উত্তর:


218

https://groups.google.com/group/golang-nuts/msg/71c307e4d73024ce?pli=1

জার্মান অংশ:

যেহেতু পূর্ণসংখ্যা ধরনের দুই এর সম্পূরক গাণিতিক ব্যবহার, আপনার জন্য ন্যুনতম / সর্বাধিক ধ্রুবক মান আবিষ্কার করতে পারেন intএবং uint। উদাহরণ স্বরূপ,

const MaxUint = ^uint(0) 
const MinUint = 0 
const MaxInt = int(MaxUint >> 1) 
const MinInt = -MaxInt - 1

@ কেরেলজেডএর মন্তব্য অনুসারে:

uint8  : 0 to 255 
uint16 : 0 to 65535 
uint32 : 0 to 4294967295 
uint64 : 0 to 18446744073709551615 
int8   : -128 to 127 
int16  : -32768 to 32767 
int32  : -2147483648 to 2147483647 
int64  : -9223372036854775808 to 9223372036854775807

66
এতে পাওয়া যায় এমনটি ব্যবহার করুন math: golang.org/pkg/math/#pkg- কনস্ট্যান্টস , আপনি math.MaxInt32সম্ভবত চান want
চার্লস এল

7
কেউ কি explain uint (0) এবং ^ uint (0) >> 1 কী করতে পারে ঠিক তা ব্যাখ্যা করতে পারে?
আরিজুন

16
@ আরিজুন, ^ এর মানে হল অভিব্যক্তিগুলিতে বিটগুলি উল্টানো যাতে যদি: uint (0) == 0000 ... 0000 (ঠিক লক্ষ্য বা আর্কিটেকচারের উপর নির্ভর করে 32 বা 64 শূন্য বিট) তবে ^ ইউনিট (0) == 1111 ... 1111 যা আমাদের স্বাক্ষরবিহীন পূর্ণসংখ্যার (সমস্তগুলি) সর্বাধিক মান দেয়। এখন আপনি যখন স্বাক্ষরিত পূর্ণসংখ্যার কথা বলছেন তখন প্রথমে (সর্বাধিক তাৎপর্যপূর্ণ) বিট স্বাক্ষরিত সর্বাধিক মান হিসাবে সাইন সংরক্ষণ করতে ব্যবহৃত হয় - আমাদের সমস্ত বিট ডানদিকে স্থানান্তর করতে হবে যা আমাদের ^ uint (0) >> 1 = দেয় = 0111 ... 1111। যা সর্বোচ্চ ধনাত্মক পূর্ণসংখ্যা দেয় ger
নিনজবয়

4
@CharlesL। শুধু ইন টাইপ সম্পর্কে কি?
ব্যবহারকারী 960567

1
আমি জানি কিছু সময় হয়ে গেছে, তবে কেবল এখানে যদি কেউ এখানে আসে এবং @ ব্যবহারকারী960567 এর প্রশ্ন-মন্তব্য দেখে: intটাইপটি 32 বিট সিস্টেমে 32 বিট দীর্ঘ এবং 64 বিট সিস্টেমে 64 বিট দীর্ঘ b এখানে দেখুন ।
ক্রিস্টোফ হার্মস-এনসিংক

73

শারীরিক ধরণের সীমা জন্য https://golang.org/ref/spec# সংখ্যার_প্রকার।

আপনার ক্ষেত্রে সর্বাধিক মানগুলি গণিত প্যাকেজে সংজ্ঞায়িত করা হয়েছে: গণিত.ম্যাক্স ইউএনটি 32

ওভারফ্লো না হওয়ায় সতর্ক থাকুন - অতীত সর্বাধিক বর্ধিতকরণের ফলে মোড়ক বাড়ে।


2
ধন্যবাদ। আমি আসলে ব্যবহার করছি uint, নেই uint32lenএবং capব্যবহার intনা int32তাই আমি ব্যবহার এমন কিছু বিষয় যা সব আর্কিটেকচারের সেই মাপ ম্যাচ চাই। math/const.goএকগুচ্ছ সংজ্ঞা দেয় Max<type>কিন্তু কোনওটি uintবা `int এর জন্য কিছুই নয় ।
মাইক স্যামুয়েল

আমি এটি uint32 বা ইউনিট 64 এ পরিবর্তন করব তবে এটি আর্কিটেকচার জুড়ে বহনযোগ্য। আমি ধর্মীয়ভাবে সবকিছু দিয়ে এটি করি। আমি আর্কিটেকচারের মধ্যে সি জাহাজের বহু বছর পেরিয়েছি এবং আমি বলতে পারি যে "সুস্পষ্ট হওয়া" পরবর্তীতে যথেষ্ট সহায়তা করবে।
মুছে ফেলা হয়েছে

ধন্যবাদ। আমার কোডটিতে এটির চেক রয়েছে uint(len(...)) < thing.minLenতবে আমি জানি না যে uint64(int)সংজ্ঞায়িত আচরণটি হবে এবং থাকবে।
মাইক স্যামুয়েল

1
যদি আপনি না জানেন তবে উপরের লিঙ্কযুক্ত অনুমানটি পড়ুন ... বিশেষত golang.org/doc/go_spec.html# রূপান্তর । "সংখ্যার ধরণের মধ্যে রূপান্তর" এর একটি সতর্ক সংজ্ঞা রয়েছে।
আনচেল শেফার-কোহেন

29

আমি mathসর্বোচ্চ মান এবং সর্বনিম্ন মান পাওয়ার জন্য প্যাকেজটি ব্যবহার করব :

func printMinMaxValue() {
    // integer max
    fmt.Printf("max int64 = %+v\n", math.MaxInt64)
    fmt.Printf("max int32 = %+v\n", math.MaxInt32)
    fmt.Printf("max int16 = %+v\n", math.MaxInt16)

    // integer min
    fmt.Printf("min int64 = %+v\n", math.MinInt64)
    fmt.Printf("min int32 = %+v\n", math.MinInt32)

    fmt.Printf("max flloat64= %+v\n", math.MaxFloat64)
    fmt.Printf("max float32= %+v\n", math.MaxFloat32)

    // etc you can see more int the `math`package
}

আউটপুট:

max int64 = 9223372036854775807
max int32 = 2147483647
max int16 = 32767
min int64 = -9223372036854775808
min int32 = -2147483648
max flloat64= 1.7976931348623157e+308
max float32= 3.4028234663852886e+38

1
এই কোডটি কাজ করে না। দুটির int64ওভারফ্লো ইনট, যা আপনি স্ট্রিং ইন্টারপোলেশন এর আগে স্পষ্টভাবে ধ্রুবকগুলি টাইপ না করেন তা হলে ঘটে। ব্যবহার করুন int64(math.MaxInt64)পরিবর্তে, দেখতে stackoverflow.com/questions/16474594/...
domoarigato

3
তবে অন্যথায়, গৃহীত উত্তরটির চেয়ে উত্তম উত্তর। :)
ডোমোরিগেটো

আপনি যদি 32-বিট শব্দের আকারের কোনও মেশিনে int64 ব্যবহার করেন তবে কী হবে? সি-তে, সংকলক INT_MIN
segue_segway

12

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

const (
    MinUint uint = 0                 // binary: all zeroes

    // Perform a bitwise NOT to change every bit from 0 to 1
    MaxUint      = ^MinUint          // binary: all ones

    // Shift the binary number to the right (i.e. divide by two)
    // to change the high bit to 0
    MaxInt       = int(MaxUint >> 1) // binary: all ones except high bit

    // Perform another bitwise NOT to change the high bit to 1 and
    // all other bits to 0
    MinInt       = ^MaxInt           // binary: all zeroes except high bit
)

শেষের দুটি পদক্ষেপ দুজনের পরিপূরক গাণিতিকগুলিতে কীভাবে ধনাত্মক এবং negativeণাত্মক সংখ্যা উপস্থাপন করা হয় তার জন্য কাজ করে। নেভিগেশন এড়িয়ে যান ভাষা স্পেসিফিকেশন অধ্যায় সাংখ্যিক ধরনের প্রাসঙ্গিক পাঠক বোঝায় Wikipedia নিবন্ধটি । আমি এটি পড়িনি, তবে চার্লস পেটজোল্ডের বই কোড থেকে দু'টির পরিপূরক সম্পর্কে আমি জানতে পেরেছি , যা কম্পিউটার এবং কোডিংয়ের ফান্ডামেন্টালগুলির কাছে খুব অ্যাক্সেসযোগ্য ভূমিকা।

আমি উপরের কোডটি রেখেছি (বেশিরভাগ মন্তব্যের বেশিরভাগ মন্তব্য) একটি সামান্য পূর্ণসংখ্যার গণিত প্যাকেজে


9

দ্রুত সংক্ষিপ্তসার:

import "math/bits"
const (
    MaxUint uint = (1 << bits.UintSize) - 1
    MaxInt int = (1 << bits.UintSize) / 2 - 1
    MinInt int = (1 << bits.UintSize) / -2
)

পটভূমি:

আমি অনুমান করি যে আপনি জানেন, uintটাইপটি হ'ল আকারের uint32বা আপনার আকারের uint64প্ল্যাটফর্মের উপর নির্ভর করে। সাধারণত, কেউ যখন এর সর্বোচ্চ আকারের কাছাকাছি আসার ঝুঁকি না থাকে কেবল তখনই এর অপ্রচলিত সংস্করণটি ব্যবহার করতে পারেন, কারণ মাপের নির্দিষ্টকরণ ব্যতীত সংস্করণটি প্ল্যাটফর্মের উপর নির্ভর করে "দেশীয়" টাইপটি ব্যবহার করতে পারে যা দ্রুত হতে থাকে।

নোট করুন যে এটি "দ্রুত" হতে থাকে কারণ বৃহত্তর বা ছোট পূর্ণসংখ্যার অনুকরণের জন্য প্রসেসরের দ্বারা কখনও কখনও অ-নেটিভ টাইপ ব্যবহার করার জন্য অতিরিক্ত গণিত এবং সীমা পরীক্ষা করা প্রয়োজন। এই বিষয়টি মনে রেখে, সচেতন থাকুন যে প্রসেসরের (বা সংকলকের অনুকূলিত কোড) পারফরম্যান্সটি আপনার নিজের সীমানা-চেকিং কোড যুক্ত করার চেয়ে প্রায় সর্বদা ভাল হতে চলেছে, সুতরাং যদি এটির কোনও ঝুঁকি থাকে তবে এটি কার্যকর হতে পারে কেবলমাত্র স্থির আকারের সংস্করণটি ব্যবহার করার জন্য অনুভূত হোন এবং অনুকূলিতকরণটি যে কোনও ফলআউটটিকে পরিচালনা করতে পারে।

এটি বলা হয়ে যাওয়ার পরেও এখনও কিছু পরিস্থিতি রয়েছে যেখানে আপনি কী নিয়ে কাজ করছেন তা জেনে রাখা কার্যকর।

" গণিত / বিটস " প্যাকেজটিতে বিটের আকার রয়েছে uint। সর্বাধিক মান নির্ধারণ করতে, 1অনেকগুলি বিট, বিয়োগ 1 দ্বারা শিফট করুন ie অর্থ:(1 << bits.UintSize) - 1

নোট করুন যে সর্বাধিক মান গণনা করার সময় uint, আপনি সাধারণত এটি স্পষ্টভাবে একটি uint(বা বৃহত্তর) ভেরিয়েবলের মধ্যে রেখে দিতে হবে, অন্যথায় সংকলকটি ব্যর্থ হতে পারে, কারণ এটি গণনাটিকে একটি স্বাক্ষরিত করার ক্ষেত্রে ডিফল্ট হবে int(যেখানে, যেমনটি হওয়া উচিত স্পষ্টত, এটি মাপসই করা হবে না), তাই:

const MaxUint uint = (1 << bits.UintSize) - 1

এটি আপনার প্রশ্নের সরাসরি উত্তর, তবে আপনার আগ্রহী হতে পারে এমন কয়েকটি গণনাও রয়েছে।

মতে বৈশিষ্ট , uintএবং intসবসময় একই আকার আছে।

uint 32 বা 64 বিট হয়

int হিসাবে একই আকার uint

সুতরাং আমরা intএকই ধরণের উত্তরটি নিয়ে এবং তার 2পরে বিয়োগ করে বিয়োগ করে সর্বোচ্চ মান নির্ধারণ করতেও এই ধ্রুবকটি ব্যবহার করতে পারি 1। অর্থাৎ,(1 << bits.UintSize) / 2 - 1

এবং ন্যূনতম মান int, 1যে অনেক বিট দ্বারা স্থানান্তরিত এবং ফলাফল ভাগ করে -2। অর্থাৎ,(1 << bits.UintSize) / -2

সংক্ষেপে:

MaxUint: (1 << bits.UintSize) - 1

MaxInt: (1 << bits.UintSize) / 2 - 1

MinInt: (1 << bits.UintSize) / -2

সম্পূর্ণ উদাহরণ (নীচের মত একই হওয়া উচিত)

package main

import "fmt"
import "math"
import "math/bits"

func main() {
    var mi32 int64 = math.MinInt32
    var mi64 int64 = math.MinInt64

    var i32 uint64 = math.MaxInt32
    var ui32 uint64 = math.MaxUint32
    var i64 uint64 = math.MaxInt64
    var ui64 uint64 = math.MaxUint64
    var ui uint64 = (1 << bits.UintSize) - 1
    var i uint64 = (1 << bits.UintSize) / 2 - 1
    var mi int64 = (1 << bits.UintSize) / -2

    fmt.Printf(" MinInt32: %d\n", mi32)
    fmt.Printf(" MaxInt32:  %d\n", i32)
    fmt.Printf("MaxUint32:  %d\n", ui32)
    fmt.Printf(" MinInt64: %d\n", mi64)
    fmt.Printf(" MaxInt64:  %d\n", i64)
    fmt.Printf("MaxUint64:  %d\n", ui64)
    fmt.Printf("  MaxUint:  %d\n", ui)
    fmt.Printf("   MinInt: %d\n", mi)
    fmt.Printf("   MaxInt:  %d\n", i)
}

ধন্যবাদ। নেটিভ সংখ্যাগুলি সম্পর্কে আপনার সতর্কতাগুলি ভালভাবে বর্ণনা করা হয়েছে, এবং আমি গণিত / বিট সম্পর্কে অবগত ছিল না।
মাইক স্যামুয়েল

uint হয় 32 বা 64 বিট, uint হিসাবে একই আকার। একটিতে যদি একটি চিহ্ন থাকে এবং অন্যটি না থাকে তবে কীভাবে এগুলি একই আকার হতে পারে?
themiDdlest

তাদের একই বিট-আকার রয়েছে, তাদের একই সর্বোচ্চ / সর্বনিম্ন মান নেই। সেই আকারের বিটগুলির মধ্যে একটি হ'ল সাইন বিট। ( /2অংশটি হ'ল অন্তত 64৪ এর জন্য ন্যূনতম / সর্বাধিক আকারের গণনা করার সময় বিবেচনা থেকে সেই বিটটিকে সরিয়ে দেয়)
পামার


4

এই সমস্যাটি সমাধান করার একটি উপায় হ'ল মানগুলি থেকে তাদের সূচনা পয়েন্টগুলি পাওয়া:

var minLen, maxLen uint
if len(sliceOfThings) > 0 {
  minLen = sliceOfThings[0].minLen
  maxLen = sliceOfThings[0].maxLen
  for _, thing := range sliceOfThings[1:] {
    if minLen > thing.minLen { minLen = thing.minLen }
    if maxLen < thing.maxLen { maxLen = thing.maxLen }
  }
}

1

একটি লাইটওয়েট প্যাকেজ এগুলিতে থাকে (পাশাপাশি অন্যান্য অন্যান্য প্রকারের সীমা এবং কিছু বিস্তৃত ব্যবহৃত পূর্ণসংখ্যার ক্রিয়া):

import (
    "fmt"
    "<Full URL>/go-imath/ix"
    "<Full URL>/go-imath/ux"
)
...
fmt.Println(ix.Minimal) // Output: -2147483648 (32-bit) or -9223372036854775808 (64-bit)
fmt.Println(ix.Maximal) // Output: 2147483647 or 9223372036854775807
fmt.Println(ux.Minimal) // Output: 0
fmt.Println(ux.Maximal) // Output: 4294967295 or 18446744073709551615

0
MaxInt8   = 1<<7 - 1
MinInt8   = -1 << 7
MaxInt16  = 1<<15 - 1
MinInt16  = -1 << 15
MaxInt32  = 1<<31 - 1
MinInt32  = -1 << 31
MaxInt64  = 1<<63 - 1
MinInt64  = -1 << 63
MaxUint8  = 1<<8 - 1
MaxUint16 = 1<<16 - 1
MaxUint32 = 1<<32 - 1
MaxUint64 = 1<<64 - 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.