Can I shorten a function name I use repeatedly?
I have a long formula, like the following:
float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
Is there a way to use s
instead of sin
in C, to shorten the formula, without affecting the running time?
c formula
|
show 8 more comments
I have a long formula, like the following:
float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
Is there a way to use s
instead of sin
in C, to shorten the formula, without affecting the running time?
c formula
2
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
25
The only effect using#define
to shortensin
tos
is to make your code unreadable
– Chris Turner
Jan 23 at 14:01
1
You could write an emac macro that writes for yousin
, whenever you type e.g.CTRL + s
. In Vim you could write oncesin
and then use the.
to repeat typing that as many times as you want.
– Joey Mallone
Jan 23 at 14:04
5
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
6
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15
|
show 8 more comments
I have a long formula, like the following:
float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
Is there a way to use s
instead of sin
in C, to shorten the formula, without affecting the running time?
c formula
I have a long formula, like the following:
float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
Is there a way to use s
instead of sin
in C, to shorten the formula, without affecting the running time?
c formula
c formula
edited Jan 27 at 18:18
double-beep
2,1382824
2,1382824
asked Jan 23 at 14:00
BenBen
676
676
2
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
25
The only effect using#define
to shortensin
tos
is to make your code unreadable
– Chris Turner
Jan 23 at 14:01
1
You could write an emac macro that writes for yousin
, whenever you type e.g.CTRL + s
. In Vim you could write oncesin
and then use the.
to repeat typing that as many times as you want.
– Joey Mallone
Jan 23 at 14:04
5
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
6
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15
|
show 8 more comments
2
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
25
The only effect using#define
to shortensin
tos
is to make your code unreadable
– Chris Turner
Jan 23 at 14:01
1
You could write an emac macro that writes for yousin
, whenever you type e.g.CTRL + s
. In Vim you could write oncesin
and then use the.
to repeat typing that as many times as you want.
– Joey Mallone
Jan 23 at 14:04
5
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
6
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15
2
2
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
25
25
The only effect using
#define
to shorten sin
to s
is to make your code unreadable– Chris Turner
Jan 23 at 14:01
The only effect using
#define
to shorten sin
to s
is to make your code unreadable– Chris Turner
Jan 23 at 14:01
1
1
You could write an emac macro that writes for you
sin
, whenever you type e.g. CTRL + s
. In Vim you could write once sin
and then use the .
to repeat typing that as many times as you want.– Joey Mallone
Jan 23 at 14:04
You could write an emac macro that writes for you
sin
, whenever you type e.g. CTRL + s
. In Vim you could write once sin
and then use the .
to repeat typing that as many times as you want.– Joey Mallone
Jan 23 at 14:04
5
5
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
6
6
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15
|
show 8 more comments
3 Answers
3
active
oldest
votes
There are at least three options for using s
for sin
:
Use a preprocessor macro:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Note that the macros definitions are immediately removed with #undef
to prevent them from affecting subsequent code. Also, you should be aware of the basics of preprocessor macro substitution, noting the fact that the first c
in c(c)
will be expanded but the second c
will not since the function-like macro c(x)
is expanded only where c
is followed by (
.
This solution will have no effect on run time.
Use an inline function:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
With a good compiler, this will have no effect on run time, since the compiler should replace a call to s
or c
with a direct call to sin
or cos
, having the same result as the original code. Unfortunately, in this case, the c
function will conflict with the c
object you show in your sample code. You will need to change one of the names.
Use function pointers:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
With a good compiler, this also will have no effect on run time, although I suspect a few more compilers might fail to optimize code using this solution than than previous solution. Again, you will have the name conflict with c
. Note that using function pointers creates a direct call to the sin
and cos
functions, bypassing any macros that the C implementation might have defined for them. (C implementations are allowed to implement library function using macros as well as functions, and they might do so to support optimizations or certain features. With a good quality compiler, this is usually a minor concern; optimization of a direct call still should be good.)
add a comment |
if I use define, does it affect runtime?
define
works by doing text-based substitution at compile time. If you #define s(x) sin(x)
then the C pre-processor will rewrite all the s(x)
into sin(x)
before the compiler gets a chance to look at it.
BTW, this kind of low-level text-munging is exactly why define can be dangerous to use for more complex expressions. For example, one classic pitfall is that if you do something like #define times(x, y) x*y
then times(1+1,2)
rewrites to 1+1*2
, which evaluates to 3
instead of the expected 4
. For more complex expressions like it is often a good idea to use inlineable functions instead.
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
add a comment |
Don't do this.
Mathematicians have been abbreviating the trigonometric functions to sin, cos, tan, sinh, cosh, and tanh for many many years now. Even though mathematicians (like me) like to use their favourite and often idiosyncratic notation so puffing up any paper by a number of pages, these have emerged as pretty standard. Even LaTeX has commands like sin
, cos
, and tan
.
The Japanese immortalised the abbreviations when releasing scientific calculators in the 1970s (the shorthand can fit easily on a button), and the C standard library adopted them.
If you deviate from this then your code immediately becomes difficult to read. This can be particularly pernicious with mathematical code where you can't immediately see the effects of a bad implementation.
But if you must, then a simple
static double(*const s)(double) = sin;
will suffice.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54328965%2fcan-i-shorten-a-function-name-i-use-repeatedly%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
There are at least three options for using s
for sin
:
Use a preprocessor macro:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Note that the macros definitions are immediately removed with #undef
to prevent them from affecting subsequent code. Also, you should be aware of the basics of preprocessor macro substitution, noting the fact that the first c
in c(c)
will be expanded but the second c
will not since the function-like macro c(x)
is expanded only where c
is followed by (
.
This solution will have no effect on run time.
Use an inline function:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
With a good compiler, this will have no effect on run time, since the compiler should replace a call to s
or c
with a direct call to sin
or cos
, having the same result as the original code. Unfortunately, in this case, the c
function will conflict with the c
object you show in your sample code. You will need to change one of the names.
Use function pointers:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
With a good compiler, this also will have no effect on run time, although I suspect a few more compilers might fail to optimize code using this solution than than previous solution. Again, you will have the name conflict with c
. Note that using function pointers creates a direct call to the sin
and cos
functions, bypassing any macros that the C implementation might have defined for them. (C implementations are allowed to implement library function using macros as well as functions, and they might do so to support optimizations or certain features. With a good quality compiler, this is usually a minor concern; optimization of a direct call still should be good.)
add a comment |
There are at least three options for using s
for sin
:
Use a preprocessor macro:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Note that the macros definitions are immediately removed with #undef
to prevent them from affecting subsequent code. Also, you should be aware of the basics of preprocessor macro substitution, noting the fact that the first c
in c(c)
will be expanded but the second c
will not since the function-like macro c(x)
is expanded only where c
is followed by (
.
This solution will have no effect on run time.
Use an inline function:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
With a good compiler, this will have no effect on run time, since the compiler should replace a call to s
or c
with a direct call to sin
or cos
, having the same result as the original code. Unfortunately, in this case, the c
function will conflict with the c
object you show in your sample code. You will need to change one of the names.
Use function pointers:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
With a good compiler, this also will have no effect on run time, although I suspect a few more compilers might fail to optimize code using this solution than than previous solution. Again, you will have the name conflict with c
. Note that using function pointers creates a direct call to the sin
and cos
functions, bypassing any macros that the C implementation might have defined for them. (C implementations are allowed to implement library function using macros as well as functions, and they might do so to support optimizations or certain features. With a good quality compiler, this is usually a minor concern; optimization of a direct call still should be good.)
add a comment |
There are at least three options for using s
for sin
:
Use a preprocessor macro:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Note that the macros definitions are immediately removed with #undef
to prevent them from affecting subsequent code. Also, you should be aware of the basics of preprocessor macro substitution, noting the fact that the first c
in c(c)
will be expanded but the second c
will not since the function-like macro c(x)
is expanded only where c
is followed by (
.
This solution will have no effect on run time.
Use an inline function:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
With a good compiler, this will have no effect on run time, since the compiler should replace a call to s
or c
with a direct call to sin
or cos
, having the same result as the original code. Unfortunately, in this case, the c
function will conflict with the c
object you show in your sample code. You will need to change one of the names.
Use function pointers:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
With a good compiler, this also will have no effect on run time, although I suspect a few more compilers might fail to optimize code using this solution than than previous solution. Again, you will have the name conflict with c
. Note that using function pointers creates a direct call to the sin
and cos
functions, bypassing any macros that the C implementation might have defined for them. (C implementations are allowed to implement library function using macros as well as functions, and they might do so to support optimizations or certain features. With a good quality compiler, this is usually a minor concern; optimization of a direct call still should be good.)
There are at least three options for using s
for sin
:
Use a preprocessor macro:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
Note that the macros definitions are immediately removed with #undef
to prevent them from affecting subsequent code. Also, you should be aware of the basics of preprocessor macro substitution, noting the fact that the first c
in c(c)
will be expanded but the second c
will not since the function-like macro c(x)
is expanded only where c
is followed by (
.
This solution will have no effect on run time.
Use an inline function:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
With a good compiler, this will have no effect on run time, since the compiler should replace a call to s
or c
with a direct call to sin
or cos
, having the same result as the original code. Unfortunately, in this case, the c
function will conflict with the c
object you show in your sample code. You will need to change one of the names.
Use function pointers:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
With a good compiler, this also will have no effect on run time, although I suspect a few more compilers might fail to optimize code using this solution than than previous solution. Again, you will have the name conflict with c
. Note that using function pointers creates a direct call to the sin
and cos
functions, bypassing any macros that the C implementation might have defined for them. (C implementations are allowed to implement library function using macros as well as functions, and they might do so to support optimizations or certain features. With a good quality compiler, this is usually a minor concern; optimization of a direct call still should be good.)
answered Jan 23 at 14:39
Eric PostpischilEric Postpischil
73.9k879160
73.9k879160
add a comment |
add a comment |
if I use define, does it affect runtime?
define
works by doing text-based substitution at compile time. If you #define s(x) sin(x)
then the C pre-processor will rewrite all the s(x)
into sin(x)
before the compiler gets a chance to look at it.
BTW, this kind of low-level text-munging is exactly why define can be dangerous to use for more complex expressions. For example, one classic pitfall is that if you do something like #define times(x, y) x*y
then times(1+1,2)
rewrites to 1+1*2
, which evaluates to 3
instead of the expected 4
. For more complex expressions like it is often a good idea to use inlineable functions instead.
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
add a comment |
if I use define, does it affect runtime?
define
works by doing text-based substitution at compile time. If you #define s(x) sin(x)
then the C pre-processor will rewrite all the s(x)
into sin(x)
before the compiler gets a chance to look at it.
BTW, this kind of low-level text-munging is exactly why define can be dangerous to use for more complex expressions. For example, one classic pitfall is that if you do something like #define times(x, y) x*y
then times(1+1,2)
rewrites to 1+1*2
, which evaluates to 3
instead of the expected 4
. For more complex expressions like it is often a good idea to use inlineable functions instead.
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
add a comment |
if I use define, does it affect runtime?
define
works by doing text-based substitution at compile time. If you #define s(x) sin(x)
then the C pre-processor will rewrite all the s(x)
into sin(x)
before the compiler gets a chance to look at it.
BTW, this kind of low-level text-munging is exactly why define can be dangerous to use for more complex expressions. For example, one classic pitfall is that if you do something like #define times(x, y) x*y
then times(1+1,2)
rewrites to 1+1*2
, which evaluates to 3
instead of the expected 4
. For more complex expressions like it is often a good idea to use inlineable functions instead.
if I use define, does it affect runtime?
define
works by doing text-based substitution at compile time. If you #define s(x) sin(x)
then the C pre-processor will rewrite all the s(x)
into sin(x)
before the compiler gets a chance to look at it.
BTW, this kind of low-level text-munging is exactly why define can be dangerous to use for more complex expressions. For example, one classic pitfall is that if you do something like #define times(x, y) x*y
then times(1+1,2)
rewrites to 1+1*2
, which evaluates to 3
instead of the expected 4
. For more complex expressions like it is often a good idea to use inlineable functions instead.
edited Jan 23 at 14:09
answered Jan 23 at 14:02
hugomghugomg
49.9k17120201
49.9k17120201
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
add a comment |
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
2
2
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
Macro substitution substitutes preprocessor tokens, not text.
– Eric Postpischil
Jan 23 at 14:25
add a comment |
Don't do this.
Mathematicians have been abbreviating the trigonometric functions to sin, cos, tan, sinh, cosh, and tanh for many many years now. Even though mathematicians (like me) like to use their favourite and often idiosyncratic notation so puffing up any paper by a number of pages, these have emerged as pretty standard. Even LaTeX has commands like sin
, cos
, and tan
.
The Japanese immortalised the abbreviations when releasing scientific calculators in the 1970s (the shorthand can fit easily on a button), and the C standard library adopted them.
If you deviate from this then your code immediately becomes difficult to read. This can be particularly pernicious with mathematical code where you can't immediately see the effects of a bad implementation.
But if you must, then a simple
static double(*const s)(double) = sin;
will suffice.
add a comment |
Don't do this.
Mathematicians have been abbreviating the trigonometric functions to sin, cos, tan, sinh, cosh, and tanh for many many years now. Even though mathematicians (like me) like to use their favourite and often idiosyncratic notation so puffing up any paper by a number of pages, these have emerged as pretty standard. Even LaTeX has commands like sin
, cos
, and tan
.
The Japanese immortalised the abbreviations when releasing scientific calculators in the 1970s (the shorthand can fit easily on a button), and the C standard library adopted them.
If you deviate from this then your code immediately becomes difficult to read. This can be particularly pernicious with mathematical code where you can't immediately see the effects of a bad implementation.
But if you must, then a simple
static double(*const s)(double) = sin;
will suffice.
add a comment |
Don't do this.
Mathematicians have been abbreviating the trigonometric functions to sin, cos, tan, sinh, cosh, and tanh for many many years now. Even though mathematicians (like me) like to use their favourite and often idiosyncratic notation so puffing up any paper by a number of pages, these have emerged as pretty standard. Even LaTeX has commands like sin
, cos
, and tan
.
The Japanese immortalised the abbreviations when releasing scientific calculators in the 1970s (the shorthand can fit easily on a button), and the C standard library adopted them.
If you deviate from this then your code immediately becomes difficult to read. This can be particularly pernicious with mathematical code where you can't immediately see the effects of a bad implementation.
But if you must, then a simple
static double(*const s)(double) = sin;
will suffice.
Don't do this.
Mathematicians have been abbreviating the trigonometric functions to sin, cos, tan, sinh, cosh, and tanh for many many years now. Even though mathematicians (like me) like to use their favourite and often idiosyncratic notation so puffing up any paper by a number of pages, these have emerged as pretty standard. Even LaTeX has commands like sin
, cos
, and tan
.
The Japanese immortalised the abbreviations when releasing scientific calculators in the 1970s (the shorthand can fit easily on a button), and the C standard library adopted them.
If you deviate from this then your code immediately becomes difficult to read. This can be particularly pernicious with mathematical code where you can't immediately see the effects of a bad implementation.
But if you must, then a simple
static double(*const s)(double) = sin;
will suffice.
edited Jan 23 at 19:56
answered Jan 23 at 15:04
BathshebaBathsheba
178k27253378
178k27253378
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54328965%2fcan-i-shorten-a-function-name-i-use-repeatedly%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
double (*s)(double) = sin;
– iBug
Jan 23 at 14:01
25
The only effect using
#define
to shortensin
tos
is to make your code unreadable– Chris Turner
Jan 23 at 14:01
1
You could write an emac macro that writes for you
sin
, whenever you type e.g.CTRL + s
. In Vim you could write oncesin
and then use the.
to repeat typing that as many times as you want.– Joey Mallone
Jan 23 at 14:04
5
I understand there might be reasons to disagree with OP's coding style but this seems to be a perfectly valid and to-the-point question. I don't see why it should be downvoted.
– hugomg
Jan 23 at 14:06
6
Not downvoting but I encourage you to reconsider youe idea. Renaming standard library functions can create confusion for future code readers and maintainers. Make your expressions more readable by using whitespace and if necessary splitting them over more than one line.
– rici
Jan 23 at 14:15