Click here to Skip to main content
13,869,185 members
Rate this:
 
Please Sign up or sign in to vote.
See more:
to find whether a number is a perfect cube or not .

What I have tried:

#include <bits/stdc++.h>
using namespace std;

int iscqrt(int x) 
{   
  
   double sr = cbrt(x); 
  return (sr - floor(sr) == 0); 
} 
int main() {
	int n;
	cin>>n;
	if(iscqrt(n))
	cout<<"perfect cube";
	else
	cout<<"no";
	
}
Posted
Updated 12-Jan-19 6:39am
Comments
Richard MacCutchan 12-Jan-19 9:52am
   
Works fine when I run it, for both values.
Prateek Krishna 12-Jan-19 9:57am
   
27 is perfect cube. so it should give perfect cube as output but it is giving no .
Richard MacCutchan 12-Jan-19 11:10am
   
Well I ran your code and it says "perfect cube" for 27 and 216. I suspect the actual code you are running is somehow different.
Rate this: bad
 
good
Please Sign up or sign in to vote.

Solution 1

You should take a look at what sr -float(sr) evaluates to. It's not zero, bet very close. On my system I get 4.44089e-16. Why would that be. This has to do with how computers represent floating point numbers (float, double, long double). In particular, some base-10 numbers cannot be represented to 100% accuracy. There is also the limitation of the precision of floating point numbers. As an example, in base-10 even 1.0/3.0 cannot be represented accurately, so the calculation (1.0/3.0)*3.0 expressed to 10 digits of precision returns 0.999999999, not 1.0. Combine those 2 things together and often times what we expect to happen when working with floating point numbers is wrong, when dealing with computers. In particular, comparison for equality, as shown here, doesn't always work as expected. In general, you'll want to know how accurate you need to be and compare within that accuracy. You might, for example, use this return( fabs(sr - floor(sr)) < 1e-6) instead of a comparison against 0.0
   
v4
Comments
KarstenK 12-Jan-19 12:41pm
   
you missed the "-" sign in "1e6". :-O
Rate this: bad
 
good
Please Sign up or sign in to vote.

Solution 2

The code works fine.

It's a bit messy and your return type for the "iscqrt" function should be a bool, not an int, but other than that, it works fine for both of your test cases and others.
   
Rate this: bad
 
good
Please Sign up or sign in to vote.

Solution 3

Doubles can be funny numbers: they don't "match" well with their decimal equivalents, so they are at best an approximation to a number, albeit a very accurate approximation.
Instead of faffing with floor, take the cube root of the number, convert it to an integer, and compare that to the original:
int iscqrt(int x) 
   {   
   int sr = (int) cbrt(x); 
   return ((int) x == sr * sr * sr); 
   } 
   
Comments
Richard MacCutchan 12-Jan-19 11:08am
   
I ran OP's code and both numbers gave true result.
OriginalGriff 12-Jan-19 11:14am
   
Hmm. Maybe it's the compiler / library he is using?
Rate this: bad
 
good
Please Sign up or sign in to vote.

Solution 4

Quote:
Why is it not working with n=27 and 216...

It is because double are "binary floating point numbers", and they they are not exact values.
Floating-point arithmetic - Wikipedia[^]
Binary Fractions and Floating Point - Binary Tutorial[^]

The solution is not to use floating point numbers like in solution 3.
   

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


Advertise | Privacy | Cookies | Terms of Service
Web03 | 2.8.190214.1 | Last Updated 12 Jan 2019
Copyright © CodeProject, 1999-2019
All Rights Reserved.
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100