|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
||||
|
||||
|
Re: remainder function
What's the issue with using the modulus operator instead of the built-in remainder function?
|
|
#2
|
||||
|
||||
|
Re: remainder function
Quote:
|
|
#3
|
|||
|
|||
|
Re: remainder function
It looks like you need to define it using extern "C" for WindRiver to compile it correctly:
Code:
#include <cmath> using namespace std; extern "C" double remainder(double, double); |
|
#4
|
||||
|
||||
|
Re: remainder function
Quote:
Code:
double myRemainder(double x, double y){
return x-y*floor(0.5+x/y);
}
|
|
#5
|
|||
|
|||
|
Re: remainder function
What about:
Code:
double EthersRemainder( double x, double y ){
int wholenumber;
wholenumber = (int)(x/y);
double result;
result = (x - (wholenumber * y));
if(result > 0.5*y) {
result -= y;
}
return result;
}
|
|
#6
|
||||
|
||||
|
Re: remainder function
That's not my remainder.
Did you compile and run it ? It doesn't work correctly. I'm sure that there's a way, with enough conditional logic, to torture fmod() or % into into a remainder* function, but what I am really asking in this thread is a) does the C++ compiler provided with FRC have the remainder* function, and b) does it behave like this: *This* is my remainder: Code:
double myRemainder(double x, double y){
return x-y*floor(0.5+x/y);
}
*per IEC 60559 as specified on Page 235 Section 7.12.10.2 of ISO/IEC 9899:TC3 Last edited by Ether : 02-01-2013 at 04:11 PM. |
|
#7
|
|||
|
|||
|
Re: remainder function
If you have a function that works, then use it?
I don't understand your qualm? I have not ever encountered a programming scenario where modulus division didn't solve my desire for a remainder, so I'm a bit lost. If there doesn't exist an operator that does what you want, then you need to either a) fabricate a solution from the operators you have access to, or b) find a library that does that for you. |
|
#8
|
||||
|
||||
|
Re: remainder function
I do use it. But I don't want to be telling other people to use my custom function if there's already a perfectly good remainder function provided with FRC C++. I don't have access to a working C++ installation, otherwise I would test it myself. I am seeking help from knowledgeable C++ users on this forum.
Quote:
Quote:
For example, the IEC60559 remainder function can take any angle and normalize it to the range -180..+180 with a single C instruction: normalizedAngle = remainder(angle,360); I'd like to know if the remainder function is supported in FRC C++ so I can recommend it to students who are trying to do this type of conversion. Neither the fmod() function nor the % operator can replicate the functionality of the remainder() function without using a bunch of conditional logic If there are any Java programmers following this thread, Java appears to have the IEC 60559 remainder function; in Java it is called IEEERemainder. See attachments. If someone would be willing to test that (compare it to the implementation I posted ealier in this thread) I'd be grateful. qualm /kwä(l)m/ Noun 1) An uneasy feeling of doubt, worry, or fear; a misgiving. 2) A momentary faint or sick feeling. Synonyms nausea - queasiness |
|
#9
|
|||
|
|||
|
Re: remainder function
In a Java SE project this
Code:
double result;
double x[] = {179, 180, 181, 359, 721, -1, -179, -180, -359, -361, -721};
for (int i = 0; i < x.length; i++){
result = Math.IEEEremainder(x[i],360.0);
System.out.println("x: " + x[i] + " rem y: 360 result: " + result);
}
Code:
x: 179.0 rem y: 360 result: 179.0 x: 180.0 rem y: 360 result: 180.0 x: 181.0 rem y: 360 result: -179.0 x: 359.0 rem y: 360 result: -1.0 x: 721.0 rem y: 360 result: 1.0 x: -1.0 rem y: 360 result: -1.0 x: -179.0 rem y: 360 result: -179.0 x: -180.0 rem y: 360 result: -180.0 x: -359.0 rem y: 360 result: 1.0 x: -361.0 rem y: 360 result: -1.0 x: -721.0 rem y: 360 result: -1.0 However I cannot use IEEERemainder() in an FRC project they have compiled the jar without it apparently. Last edited by omalleyj : 02-01-2013 at 07:16 PM. Reason: still can't spell after all these years |
|
#10
|
||||
|
||||
|
Re: remainder function
Quote:
Quote:
Are there any C++ gurus out there who can look into the same question for C++ ? |
|
#11
|
||||||
|
||||||
|
Re: remainder function
That's not entirely true. FRC uses the Squawk JVM, which is based on Java ME. Java ME does not require IEEERemainder(), which is why it isn't in java.lang.Math. However, Squawk does implement some features from Java SE, and puts them in other packages. In this case, IEEERemainder is in the com.sun.squawk.util.MathUtils package.
Last edited by Joe Ross : 02-01-2013 at 08:42 PM. |
|
#12
|
|||
|
|||
|
Re: remainder function
Thanks!
Is there a cross reference of where SE stuff that's been moved can be found? Last edited by omalleyj : 02-01-2013 at 08:46 PM. Reason: added a question |
|
#13
|
||||||
|
||||||
|
Re: remainder function
It's all in the javadocs, but I'm not aware of an easy cross reference.
|
|
#14
|
||||
|
||||
|
Re: remainder function
Quote:
|
|
#15
|
||||||
|
||||||
|
Re: remainder function
Here's the result from the robot
Code:
double result;
double x[] = {179, 180, 181, 359, 721, -1, -179, -180, -359, -361, -721};
for (int i = 0; i < x.length; i++){
result = MathUtils.IEEEremainder(x[i],360.0);
System.out.println("x: " + x[i] + " rem y: 360 result: " + result);
}
Quote:
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|