swift - দ্রুততম নিকটতম ইন্টে একটি ডাবল বৃত্তাকার কিভাবে?




int double (5)

আমি বৃদ্ধির হার ( Double ) এর ক্যালকুলেটর তৈরি করার চেষ্টা করছি যা পরিসংখ্যানকে নিকটতম পূর্ণসংখ্যাতে ঘোরাবে এবং সেখানে থেকে পুনর্বিবেচনা করবে যেমন:

let firstUsers = 10.0
let growth = 0.1
var users = firstUsers
var week = 0


while users < 14 {
    println("week \(week) has \(users) users")
    users += users * growth
    week += 1
}

কিন্তু আমি এতদূর অক্ষম হয়েছি।

সম্পাদন করুন আমি Kinda তাই এটি পছন্দ করেছেন:

var firstUsers = 10.0
let growth = 0.1
var users:Int = Int(firstUsers)
var week = 0


while users <= 14 {
    println("week \(week) has \(users) users")
    firstUsers += firstUsers * growth
    users = Int(firstUsers)
    week += 1
}

যদিও আমি মনে করি না যে এটি সর্বদা firstUsers করছে, তবে আমি এটি পছন্দ করি না কারণ প্রথম firstUsers একটি পরিবর্তনশীল এবং প্রোগ্রাম জুড়ে পরিবর্তন করতে হয়েছিল (পরবর্তী গণনা করার জন্য), যা আমি এটি করতে চাই না ।


সুইফ্ট 3 এবং 4 - rounded(_:) পদ্ধতিটি FloatingPoint প্রোটোকলের ব্লুপ্রিন্ট হিসাবে ব্যবহার করা

FloatingPoint প্রোটোকল (যার জন্য Double এবং Float conforms) rounded() blueprints

func rounded(_ rule: FloatingPointRoundingRule) -> Self

যেখানে FloatingPointRoundingRule একটি বৃত্তাকার বিভিন্ন বৃত্তাকার নিয়ম সংখ্যার একটি enumating হয়:

case awayFromZero

নিকটতম অনুমিত মানের বৃত্ত যার সীমাটি উৎসের চেয়ে বড় বা সমান।

case down

সোর্স থেকে কম বা সমান যে নিকটতম অনুমিত মান পর্যন্ত গোল।

case toNearestOrAwayFromZero

নিকটতম অনুমোদিত মান বৃত্তাকার; যদি দুটি মান সমানভাবে বন্ধ থাকে তবে বৃহত্তর পরিমাপের সাথে একটি বেছে নেওয়া হয়।

case toNearestOrEven

নিকটতম অনুমোদিত মান বৃত্তাকার; যদি দুটি মান সমানভাবে বন্ধ হয়, এমনকি এক চয়ন করা হয়।

case towardZero

নিকটতম অনুমিত মান যা ঘনত্বের উৎসের তুলনায় কম বা তার সমান।

case up

সোর্স থেকে সমান বা সমান নিকটতম অনুমিত মান যা রাউন্ড।

@ সারগাচের চমৎকার উত্তর থেকে অনুশীলনকারীদের মধ্যে এই বিভিন্ন গোলাকার বিকল্পগুলি দেখানোর জন্য আমরা একই ধরণের উদাহরণগুলি ব্যবহার করি।

.awayFromZero

নিকটতম অনুমিত মানের বৃত্ত যার সীমা উৎসের চেয়ে সমান বা সমান; সি ফাংশনগুলির মধ্যে কোন সরাসরি সমতুল্য নয়, কারণ এটি self , ceil বা floor self ইতিবাচক এবং নেতিবাচক মানের জন্য self করে।

3.000.rounded(.awayFromZero) // 3.0
3.001.rounded(.awayFromZero) // 4.0
3.999.rounded(.awayFromZero) // 4.0

(-3.000).rounded(.awayFromZero) // -3.0
(-3.001).rounded(.awayFromZero) // -4.0
(-3.999).rounded(.awayFromZero) // -4.0

.down

সি floor ফাংশন সমান।

3.000.rounded(.down) // 3.0
3.001.rounded(.down) // 3.0
3.999.rounded(.down) // 3.0

(-3.000).rounded(.down) // -3.0
(-3.001).rounded(.down) // -4.0
(-3.999).rounded(.down) // -4.0

.toNearestOrAwayFromZero

সি round ফাংশন সমান।

3.000.rounded(.toNearestOrAwayFromZero) // 3.0
3.001.rounded(.toNearestOrAwayFromZero) // 3.0
3.499.rounded(.toNearestOrAwayFromZero) // 3.0
3.500.rounded(.toNearestOrAwayFromZero) // 4.0
3.999.rounded(.toNearestOrAwayFromZero) // 4.0

(-3.000).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.001).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.499).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.500).rounded(.toNearestOrAwayFromZero) // -4.0
(-3.999).rounded(.toNearestOrAwayFromZero) // -4.0

এই বৃত্তাকার নিয়মটি শূন্য আর্গুমেন্ট rounded() পদ্ধতি ব্যবহার করেও অ্যাক্সেস করা যেতে পারে।

3.000.rounded() // 3.0
// ...

(-3.000).rounded() // -3.0
// ...

.toNearestOrEven

নিকটতম অনুমোদিত মান বৃত্তাকার; যদি দুটি মান সমানভাবে সমান হয়, এমনকি এক চয়ন করা হয়; সি nearbyint সমতুল্য (/ কাছাকাছি কাছাকাছি অনুরূপ) ফাংশন।

3.499.rounded(.toNearestOrEven) // 3.0
3.500.rounded(.toNearestOrEven) // 4.0 (up to even)
3.501.rounded(.toNearestOrEven) // 4.0

4.499.rounded(.toNearestOrEven) // 4.0
4.500.rounded(.toNearestOrEven) // 4.0 (down to even)
4.501.rounded(.toNearestOrEven) // 4.0

.towardZero

সি trunc ফাংশন trunc

3.000.rounded(.towardZero) // 3.0
3.001.rounded(.towardZero) // 3.0
3.999.rounded(.towardZero) // 3.0

(-3.000).rounded(.towardZero) // 3.0
(-3.001).rounded(.towardZero) // 3.0
(-3.999).rounded(.towardZero) // 3.0

বৃত্তাকার উদ্দেশ্য পূর্ণসংখ্যা দিয়ে কাজ করার জন্য প্রস্তুত করা হয় (উদাহরণস্বরূপ, FloatPoint পরে FloatPoint প্রারম্ভ দ্বারা Int ব্যবহার করে), আমরা কেবলমাত্র একটি Double (বা Float ইত্যাদি) ব্যবহার করে একটি Int ইনিশিয়াল করার সময়, এই দশমিক অংশটি ব্যবহার করতে পারি দূরে ছিন্ন করা হবে।

Int(3.000) // 3
Int(3.001) // 3
Int(3.999) // 3

Int(-3.000) // -3
Int(-3.001) // -3
Int(-3.999) // -3

.up

সি ceil ফাংশন সমান।

3.000.rounded(.up) // 3.0
3.001.rounded(.up) // 4.0
3.999.rounded(.up) // 4.0

(-3.000).rounded(.up) // 3.0
(-3.001).rounded(.up) // 3.0
(-3.999).rounded(.up) // 3.0

সংযোজন: বিভিন্ন FloatingPointRoundingRule নিয়মগুলির জন্য C ফাংশন সমতুল্য যাচাই করতে FloatingPoint জন্য উত্স FloatingPoint যান

যদি আমরা চাই, আমরা FloatingPoint প্রোটোকলের জন্য সোর্স কোডটি দেখতে পারি সরাসরি সি ফাংশন সমতুল্যগুলিকে পাবলিক FloatingPointRoundingRule নিয়মগুলিতে দেখতে।

swift/stdlib/public/core/FloatingPoint.swift.gyb আমরা দেখি যে rounded(_:) পদ্ধতির ডিফল্ট বাস্তবায়ন আমাদেরকে পরিবর্তনশীল round(_:) পদ্ধতির মাধ্যমে তৈরি করে:

public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
    var lhs = self
    lhs.round(rule)
    return lhs
}

swift/stdlib/public/core/FloatingPointTypes.swift.gyb আমরা round(_:) ডিফল্ট বাস্তবায়ন খুঁজে পেয়েছি, যার মধ্যে FloatingPointRoundingRule নিয়ম এবং সি বৃত্তাকার ফাংশনগুলির সমতুল্য দৃশ্যমান:

public mutating func round(_ rule: FloatingPointRoundingRule) {
    switch rule {
    case .toNearestOrAwayFromZero:
        _value = Builtin.int_round_FPIEEE${bits}(_value)
    case .toNearestOrEven:
        _value = Builtin.int_rint_FPIEEE${bits}(_value)
    case .towardZero:
        _value = Builtin.int_trunc_FPIEEE${bits}(_value)
    case .awayFromZero:
        if sign == .minus {
            _value = Builtin.int_floor_FPIEEE${bits}(_value)
        }
        else {
            _value = Builtin.int_ceil_FPIEEE${bits}(_value)
        }
    case .up:
        _value = Builtin.int_ceil_FPIEEE${bits}(_value)
    case .down:
        _value = Builtin.int_floor_FPIEEE${bits}(_value)
    }
}

আপনি সুইফ্ট 3 এ ফ্লোটিংপয়েন্ট প্রসারিত করতে পারেন:

extension FloatingPoint {
    func rounded(to n: Int) -> Self {
        return (self / Self(n)).rounded() * Self(n)

    }
}

324.0.rounded(to: 5)   // 325

সুইফট 3: আপনি যদি নির্দিষ্ট সংখ্যক সংখ্যার উপর রাউন্ড করতে চান যেমন 5.678434 -> 5.68 আপনি একটি গুণের সাথে বৃত্তাকার () বা roundf () ফাংশনটি একত্রিত করতে পারেন:

    let value:Float = 5.678434
    let roundedValue = roundf(value * 100) / 100
    print(roundedValue) //5.68

সুইফ্ট 3

var myNum = 8.09

myNum.rounded () // ফলাফল = 8 যা myNum এ সংরক্ষিত হয়


**In Swift**

var a = 14.123456789
var b = 14.123456789
var c = 14.123456789
var d = 14.123456789
var e = 14.123456789
var f = 14.123456789

a.rounded(.up)                      //15
b.rounded(.down)                    //14
c.rounded(.awayFromZero)            //15
d.rounded(.towardZero)              //14
e.rounded(.toNearestOrAwayFromZero) //14
f.rounded(.toNearestOrEven)         //14




rounding