একটি ভাসমান মান একটি সম্পূর্ণ সংখ্যা কিনা তা কীভাবে পরীক্ষা করবেন


202

আমি সর্ববৃহৎ কিউব রুটটি সন্ধান করার চেষ্টা করছি যা পুরো সংখ্যা, যা 12,000 এরও কম।

processing = True
n = 12000
while processing:
    n -= 1
    if n ** (1/3) == #checks to see if this has decimals or not

আমি নিশ্চিত না কীভাবে এটি পুরো নম্বর কিনা তা যাচাই করতে হবে কিনা! আমি এটিকে একটি স্ট্রিংয়ে রূপান্তর করতে পারতাম তবে শেষের মানগুলি পরীক্ষা করতে ইনডেক্সিং ব্যবহার করতে পারতাম এবং সেগুলি শূন্য কিনা তা দেখুন না, বরং এটি জটিল বলে মনে হচ্ছে। একটি সহজ উপায় আছে কি?


3
এটি কিউব মূল থেকে কাজ করা সহজ করবে এন -> (এন * এন * এন <12000)
সন্দেহজনক

উত্তর:


366

একটি ভাসমান মান একটি সম্পূর্ণ সংখ্যা কিনা তা পরীক্ষা করতে, float.is_integer()পদ্ধতিটি ব্যবহার করুন :

>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False

floatপাইথন ২.6- তে এই পদ্ধতিটি যুক্ত করা হয়েছিল ।

অ্যাকাউন্ট পাইথন 2, মধ্যে নিতে 1/3হয় 0(পূর্ণসংখ্যা operands জন্য মেঝে বিভাজন!), এবং ফ্লোটিং পয়েন্ট গাণিতিক যথাযথ নয় এমন হতে পারে যে (ক floatবাইনারি ভগ্নাংশ ব্যবহার প্রায় সঠিক পরিমাপ না একটি সুনির্দিষ্ট বাস্তব সংখ্যা)। তবে আপনার লুপটি সামঞ্জস্য করা এটি দেয়:

>>> for n in range(12000, -1, -1):
...     if (n ** (1.0/3)).is_integer():
...         print n
... 
27
8
1
0

যার অর্থ 3 টি কিউবডেরও বেশি (10648 সহ) উল্লিখিত অনর্থকতার কারণে বাদ পড়েছিল:

>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996

পরিবর্তে আপনাকে পুরো নম্বরটির নিকটবর্তী সংখ্যাগুলি পরীক্ষা করতে হবে, বা float()আপনার নম্বরটি খুঁজে পেতে ব্যবহার করবেন না । এর কিউব রুটটি গোল করে দেওয়ার মতো 12000:

>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648

আপনি যদি পাইথন 3.5 বা ততোধিক নতুন ব্যবহার করছেন তবে আপনি কোনও ফ্লোটিং পয়েন্টের মানটি কনফিগারযোগ্য মার্জিনের মধ্যে রয়েছে কিনা তা দেখতে math.isclose()ফাংশনটি ব্যবহার করতে পারেন :

>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True

পুরানো সংস্করণগুলির জন্য, পিইপি 485-তে উল্লিখিত ফাংশনটির নিষ্পাপ বাস্তবায়ন (ত্রুটি যাচাই এবং এফএনটি উপেক্ষা করে এড়িয়ে যাওয়া) :

def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
    return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

অজগর না জানা, এই ধরণের বিবৃতি আমাকে নার্ভাস করে দেবে বলে মনে হয় যে এটি বাস্তব বিশ্বে কাজ করার জন্য নিখুঁত গণিতের প্রয়োজন।
পিটার এম

1
@ পিটারএম: Trueকোনও দশমিক ছাড়াই পদ্ধতিটি কেবল তখনই ফিরে আসে । অবশ্যই ভাসমান পয়েন্ট গণিত এবং নির্ভুলতা সম্পর্কে ওপির পক্ষ থেকে একটি ভুল বোঝাবুঝি হতে পারে।
মার্টিজন পিটারস

1
@ মার্তিজ্নপিটারস হ্যাঁ এবং একটি ভাসমান পয়েন্ট গণনায় একটি ছোট স্লিপ এবং হঠাৎ আপনার কাছে এই ছোট, অযাচিত দশমিকগুলি রয়েছে 0.00000000000000000001
পিটার এম

1
@ পিটারএম: এবং পাইথন ২-এ ডিফল্ট উপস্থাপনাটি ১ digit সংখ্যার চেয়ে বেশি হবে; 3 1.0000000000000001হিসাবে প্রদর্শিত হয় 1.0, একই মান উত্পাদন করে সংক্ষিপ্ততম স্ট্রিং প্রতিনিধিত্ব দেখানো হয়।
মার্টিজন পিটারস

আপনার range(12000, -1, -1)হতে পারে (ইমো, আরও পরিষ্কারভাবে) reversed(range(12000+1))
লিখিতভাবে

36

আমরা মডুলো (%) অপারেটরটি ব্যবহার করতে পারি। এটি আমাদের জানায় যে আমরা যখন x দ্বারা y দিয়ে ভাগ করি তখন আমাদের কতজন অবশিষ্ট থাকে asx % y । প্রতিটি পুরো সংখ্যাটি 1 দ্বারা বিভাজন করতে হবে, সুতরাং যদি সেখানে কোনও অবশিষ্ট থাকে, তবে এটি অবশ্যই পুরো সংখ্যাটি হবে না।

এই ফাংশনটি একটি বুলিয়ান প্রদান করবে, Trueবা পুরো সংখ্যা Falseকিনা nতার উপর নির্ভর করে ।

def is_whole(n):
    return n % 1 == 0

15

আপনি এটি ব্যবহার করতে পারেন:

if k == int(k):
    print(str(k) + " is a whole number!")

5
কাজ চালিয়ে যাওয়ার সময় এটি বৃহত্তর সংখ্যায় ব্যর্থ .is_integer()হয়।
jfs

আপনার লিঙ্ক আইএমএইচও দেখায় না যে এটি কাজ করে না। এটি কেবল দেখায় যে বড় ফ্লোটগুলি নির্ভুলতা হারাতে পারে। is_integerএকটি অনুরূপ পদ্ধতি ব্যবহার ( o = (floor(x) == x) ? Py_True : Py_False;)। তবে আমি একমত, is_integer()এটি আরও পরিষ্কার হিসাবে ব্যবহার করা উচিত ।
জুড়ি রবল

1
হ্যাঁ. এটি কেবল দেখায় যে বড় ফ্লোট যথার্থতা হারাতে large_float == large_intপারে, যদিও ব্যর্থও হতে পারে large_float == float(large_int)
jfs

2
123456789012345678901234567890.0 != 123456789012345678901234567890তবে123456789012345678901234567890.0 == float(123456789012345678901234567890)
jfs

2
হ্যাঁ, তবে k = 123456789012345678901234567890.0তারপরে k == int(k)সত্য, যা সঠিক উত্তর।
জুড়ি রবল

9

আপনাকে লুপ বা কোনও কিছু পরীক্ষা করার দরকার নেই। কেবল 12,000 এর কিউব রুট নিন এবং এটিকে বৃত্তাকার করুন:

r = int(12000**(1/3.0))
print r*r*r # 10648

এটি একটি যুক্তিসঙ্গত উত্তর।
হুগড্রাউনটি

7

আপনি এটির জন্য একটি মডুলো অপারেশন ব্যবহার করতে পারেন ।

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")

2
যদি n6.2, 6.0, 6.12312412 হয়, আমরা সবাই "We have a decimal number here!"?
জে ওয়াং

@ জায়েওয়ং আপনি কীভাবে আপনার পরীক্ষা লোড করেছেন তা নিশ্চিত নন, তবে পাইথন 3..7 ব্যবহার করে এটি আমার মেশিনে দুর্দান্ত কাজ করে।
Zchpyvr

6

কিউব শিকড়গুলি পরীক্ষা করা কি সহজ হবে না? 20 (20 ** 3 = 8000) দিয়ে শুরু করুন এবং 30 (30 ** 3 = 27000) এ যান। তারপরে আপনাকে 10 টিরও কম পূর্ণসংখ্যার পরীক্ষা করতে হবে।

for i in range(20, 30):
    print("Trying {0}".format(i))
    if i ** 3 > 12000:
        print("Maximum integral cube root less than 12000: {0}".format(i - 1))
        break

1
তদুপরি, ফ্লোটগুলির রাউন্ড-অফ ত্রুটি রয়েছে যাতে n**(1/3)পূর্ণসংখ্যা হয় কিনা তা গণনা করার সময় আপনি সংখ্যাটি মিস করতে পারেন । উদাহরণস্বরূপ আমার কম্পিউটারে `10648 ** (1/3) = 21.999999999999996` এর পরিবর্তে 22: সমস্যা! এই উত্তরের পদ্ধতিতে এ জাতীয় সমস্যা নেই। আমি মনে করি গণিতের দৃষ্টিকোণ থেকে এটিই একমাত্র সঠিক সমাধান (অন্যের সমাধান পাইথন-সঠিক)।
জেপিজি


3

উপরের উত্তরগুলি অনেক ক্ষেত্রে কাজ করে তবে সেগুলি কিছু মিস করে। নিম্নোক্ত বিবেচনা কর:

fl = sum([0.1]*10)  # this is 0.9999999999999999, but we want to say it IS an int

এটিকে একটি মানদণ্ড হিসাবে ব্যবহার করে, অন্যান্য কিছু পরামর্শ আমাদের পছন্দমতো আচরণটি পায় না:

fl.is_integer() # False

fl % 1 == 0     # False

পরিবর্তে চেষ্টা করুন:

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

def is_integer(fl):
    return isclose(fl, round(fl))

এখন আমরা পেয়েছি:

is_integer(fl)   # True

iscloseদিয়ে আসে পাইথন 3.5+ , এবং (যেমন সংশ্লিষ্ট উল্লিখিত অন্যান্য পাইথন এর জন্য আপনি এই বেশিরভাগই সমতুল্য সংজ্ঞা ব্যবহার করতে পারেন PEP )


1
math.fsum([0.1] * 10) == 1
একিউম্যানাস

1

কেবলমাত্র একটি পাশের তথ্য, is_integerঅভ্যন্তরীণভাবে করছে:

import math
isInteger = (math.floor(x) == x)

ঠিক পাইথনে নয়, সিপাইথন বাস্তবায়ন উপরে বর্ণিত হিসাবে প্রয়োগ করা হয়েছে।


1

সমস্ত উত্তর ভাল তবে একটি নিশ্চিত আগুন পদ্ধতি হবে

def whole (n):
     return (n*10)%10==0

ফাংশনটি সত্যটি ফেরত দেয় যদি এটি অন্য একটি সম্পূর্ণ সংখ্যা হয় তবে মিথ্যা .... আমি জানি আমি কিছুটা দেরি করেছি তবে এখানে তৈরি একটি আকর্ষণীয় পদ্ধতি এখানে ...

সম্পাদনা করুন: নীচের মন্তব্যে বর্ণিত হিসাবে, একটি সস্তা সমতুল্য পরীক্ষাটি হবে:

def whole(n):
    return n%1==0

1
এটির চেয়ে কার্যত পৃথক হওয়া উচিত নয় n % 1 == 0। এই ক্ষেত্রে, আপনি দুটি অপারেশন করছেন যা একটি সস্তা সমতুল্য পরীক্ষার জন্য বেশি ব্যয়বহুল।
Zchpyvr

0
>>> def is_near_integer(n, precision=8, get_integer=False):
...     if get_integer:
...         return int(round(n, precision))
...     else:
...         return round(n) == round(n, precision)
...
>>> print(is_near_integer(10648 ** (1.0/3)))
True
>>> print(is_near_integer(10648 ** (1.0/3), get_integer=True))
22
>>> for i in [4.9, 5.1, 4.99, 5.01, 4.999, 5.001, 4.9999, 5.0001, 4.99999, 5.000
01, 4.999999, 5.000001]:
...     print(i, is_near_integer(i, 4))
...
4.9 False
5.1 False
4.99 False
5.01 False
4.999 False
5.001 False
4.9999 False
5.0001 False
4.99999 True
5.00001 True
4.999999 True
5.000001 True
>>>

আমি কীভাবে একটি ভাল উত্তর লিখতে পারি তার জন্য এখানে কিছু গাইডলাইন রয়েছে । এই প্রদত্ত উত্তরটি সঠিক হতে পারে, তবে এটি একটি ব্যাখ্যা থেকে উপকৃত হতে পারে। কোডের উত্তরগুলিকে "ভাল" উত্তর হিসাবে বিবেচনা করা হয় না। পর্যালোচনা থেকে ।
ট্রেনটন ম্যাককিনি

-1

ব্যবহার করার চেষ্টা করুন:

int(val) == val

এটি অন্য যে কোনও পদ্ধতির চেয়ে অনেক বেশি নির্ভুলতা দেবে।


"এটি আরও অনেক নির্ভুলতা দেবে" এই দাবির ব্যাক আপ করার জন্য আপনি কি উদাহরণ দিতে পারেন? এটিকে নির্বিকার বলে মনে হচ্ছে।
মার্ক ডিকিনসন

-1

আপনি roundমানটি গণনা করতে ফাংশনটি ব্যবহার করতে পারেন ।

হ্যাঁ অজগরটিতে অনেকেই যখন আমরা একটি কিউব মূলের মান গণনা করে বলেছি যে এটি আপনাকে কিছুটা ত্রুটি দিয়ে আউটপুট দেবে। মানটি পুরো নম্বর কিনা আপনি তা পরীক্ষা করতে নীচের ফাংশনটি ব্যবহার করতে পারেন:

def cube_integer(n):
    if round(n**(1.0/3.0))**3 == n:
        return True
    return False

তবে মনে রাখবেন যে int(n)এটি সমান math.floorএবং এর জন্য যদি আপনি খুঁজে পান তবে int(41063625**(1.0/3.0))আপনি 345 এর পরিবর্তে 344 পাবেন get

সুতরাং দয়া করে intঘন ঘন শিকড় ব্যবহার করার সময় সতর্কতা অবলম্বন করুন ।

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