* forcing float arithmetic. @ 2021-03-24 17:19 Ray Andrews 2021-03-24 17:56 ` Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2021-03-24 17:19 UTC (permalink / raw) To: Zsh Users #integer nn=4 typeset -F nn=4 typeset -F aa= (( aa = ((2 * nn) - 1) / (nn**2) )) echo $aa If 'nn' is declared as an integer the above echos zero but if as a float the answer is correct. But nn will never actually be other than an integer so I don't like to declare it as a float. Am I not expecting successful arithmetic even with the integer? I know you can force the issue with: (( aa = ((2 * nn) - 1) / (nn**2.0) )) ... but I wonder why that's needed. Why are answers dumbed down like that? It's clearly a design decision but it seems to me unnatural. If 'aa' was an integer too I understand the result would have to be rounded down to zero, but since aa is a float, shouldn't all arithmetic automatically produce floating point results? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-24 17:19 forcing float arithmetic Ray Andrews @ 2021-03-24 17:56 ` Bart Schaefer 2021-03-24 21:51 ` Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2021-03-24 17:56 UTC (permalink / raw) To: Ray Andrews; +Cc: Zsh Users On Wed, Mar 24, 2021 at 10:20 AM Ray Andrews <rayandrews@eastlink.ca> wrote: > > Why are answers dumbed down like that? Every subexpression is considered independently, so float conversion doesn't take place until the assignment is evaluated. The type of the lvalue does not propagate across every rvalue. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-24 17:56 ` Bart Schaefer @ 2021-03-24 21:51 ` Ray Andrews 2021-03-24 21:54 ` Roman Perepelitsa 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2021-03-24 21:51 UTC (permalink / raw) To: zsh-users On 2021-03-24 10:56 a.m., Bart Schaefer wrote: > On Wed, Mar 24, 2021 at 10:20 AM Ray Andrews <rayandrews@eastlink.ca> wrote: >> Why are answers dumbed down like that? > Every subexpression is considered independently, so float conversion > doesn't take place until the assignment is evaluated. The type of the > lvalue does not propagate across every rvalue. > So it's procedural rather than deliberate/designed. It's not hard to cope with still I'd vote to correct it -- one of those things where a look ahead could sorta say that if the lvalue is float, then all subsequent arithmetic will be float. Or not worth the trouble, it's easy enough to work around. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-24 21:51 ` Ray Andrews @ 2021-03-24 21:54 ` Roman Perepelitsa 2021-03-24 21:59 ` Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Roman Perepelitsa @ 2021-03-24 21:54 UTC (permalink / raw) To: Ray Andrews; +Cc: Zsh Users [-- Attachment #1: Type: text/plain, Size: 948 bytes --] On Wed, Mar 24, 2021 at 10:51 PM Ray Andrews <rayandrews@eastlink.ca> wrote: > On 2021-03-24 10:56 a.m., Bart Schaefer wrote: > > On Wed, Mar 24, 2021 at 10:20 AM Ray Andrews <rayandrews@eastlink.ca> > wrote: > >> Why are answers dumbed down like that? > > Every subexpression is considered independently, so float conversion > > doesn't take place until the assignment is evaluated. The type of the > > lvalue does not propagate across every rvalue. > > > So it's procedural rather than deliberate/designed. It's not hard to > cope with > still I'd vote to correct it -- one of those things where a look ahead > could > sorta say that if the lvalue is float, then all subsequent arithmetic > will be > float. Or not worth the trouble, it's easy enough to work around. > The behavior of zsh in this regard is consistent with C and all languages inspired by it (C++, Java, C# and many, many others). This is really working as intended. Roman. [-- Attachment #2: Type: text/html, Size: 1408 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-24 21:54 ` Roman Perepelitsa @ 2021-03-24 21:59 ` Bart Schaefer 2021-03-25 1:12 ` Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2021-03-24 21:59 UTC (permalink / raw) To: Roman Perepelitsa; +Cc: Ray Andrews, Zsh Users On Wed, Mar 24, 2021 at 2:54 PM Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote: > > The behavior of zsh in this regard is consistent with C and all languages inspired by it (C++, Java, C# and many, many others). This is really working as intended. Proof: #include <stdio.h> void main() { int x = 3, y = 7; float z = (x/y); printf("%g\n", z); } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-24 21:59 ` Bart Schaefer @ 2021-03-25 1:12 ` Ray Andrews 2021-03-25 1:36 ` Daniel Shahaf 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2021-03-25 1:12 UTC (permalink / raw) To: zsh-users On 2021-03-24 2:59 p.m., Bart Schaefer wrote: > On Wed, Mar 24, 2021 at 2:54 PM Roman Perepelitsa > <roman.perepelitsa@gmail.com> wrote: >> The behavior of zsh in this regard is consistent with C and all languages inspired by it (C++, Java, C# and many, many others). This is really working as intended. > Proof: > > #include <stdio.h> > void main() { > int x = 3, y = 7; > float z = (x/y); > printf("%g\n", z); > } > Long time since I did any floating point in C, so I'll take you guy's word for it. Final shot would that since one can force the conversion by, say, multiplying by 1.0, which is otherwise pointless, one could imagine some option whereby the bother is simply not required. (( aa = ((2 * nn) - 1) / (nn**2.0) )) ... in that case the denominator is not changed in any way, yet if flags that the division should be passed as a float. Seems an awkward way of getting the conversion. How is 2^2 different from 2^2.0 ? If 'aa' was an integer then of course the result must be rounded, but it still seems to me the float should receive the actual result. One of my little whines, nothing of substance. Still one might dream of setopt AUTO_FLOAT. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-25 1:12 ` Ray Andrews @ 2021-03-25 1:36 ` Daniel Shahaf 2021-03-25 1:45 ` Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Daniel Shahaf @ 2021-03-25 1:36 UTC (permalink / raw) To: zsh-users Ray Andrews wrote on Wed, Mar 24, 2021 at 18:12:29 -0700: > On 2021-03-24 2:59 p.m., Bart Schaefer wrote: > > On Wed, Mar 24, 2021 at 2:54 PM Roman Perepelitsa > > <roman.perepelitsa@gmail.com> wrote: > > > The behavior of zsh in this regard is consistent with C and all languages inspired by it (C++, Java, C# and many, many others). This is really working as intended. > > Proof: > > > > #include <stdio.h> > > void main() { > > int x = 3, y = 7; > > float z = (x/y); > > printf("%g\n", z); > > } > > > Long time since I did any floating point in C, so I'll take you guy's word > for it. Final shot would that since one can force the conversion by, say, > multiplying by 1.0, which is otherwise pointless, one could imagine some > option whereby the bother is simply not required. > > (( aa = ((2 * nn) - 1) / (nn**2.0) )) > > ... in that case the denominator is not changed in any way, yet if flags > that the division should be passed as a float. Seems an awkward way of > getting the conversion. How is 2^2 different from 2^2.0 ? If 'aa' was an > integer then of course the result must be rounded, but it still seems to me > the float should receive the actual result. The «/» operator is defined to perform integer division (discarding the remainder) when both of its arguments are integers, and floating-point division otherwise. That _is_ inconsistent, in a way, since in C it's not possible to implement a two-argument function that has the same semantics as the «/» operator for both integral and floating-point types… but that's how it is. > One of my little whines, nothing of substance. Still one might dream > of setopt AUTO_FLOAT. Python 3's division operator always returns floats. Daniel ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-25 1:36 ` Daniel Shahaf @ 2021-03-25 1:45 ` Ray Andrews 2021-03-25 2:37 ` Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2021-03-25 1:45 UTC (permalink / raw) To: zsh-users On 2021-03-24 6:36 p.m., Daniel Shahaf wrote: > The «/» operator is defined to perform integer division (discarding the > remainder) when both of its arguments are integers, and floating-point > division otherwise. Sounds pretty well written in stone. One of those things that goes back from before the flood. > > Python 3's division operator always returns floats. I'd think of it as polite. Just now I'm doing this: (( divided = sum * 1.0 / level )) ... and it really does seem belabored. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-25 1:45 ` Ray Andrews @ 2021-03-25 2:37 ` Bart Schaefer 2021-03-25 3:22 ` Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2021-03-25 2:37 UTC (permalink / raw) To: Ray Andrews; +Cc: Zsh Users On Wed, Mar 24, 2021 at 6:45 PM Ray Andrews <rayandrews@eastlink.ca> wrote: > > I'd think of it as polite. Just now I'm doing this: > > (( divided = sum * 1.0 / level )) > > ... and it really does seem belabored. Doc, Arithmetic Evaluation section: Users should beware that, in common with many other programming languages but not software designed for calculation, the evaluation of an expression in zsh is taken a term at a time and promotion of integers to floating point does not occur in terms only containing integers. A typical result of this is that a division such as 6/8 is truncated, in this being rounded towards 0. The FORCE_FLOAT shell option can be used in scripts or functions where floating point evaluation is required throughout. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: forcing float arithmetic. 2021-03-25 2:37 ` Bart Schaefer @ 2021-03-25 3:22 ` Ray Andrews 0 siblings, 0 replies; 10+ messages in thread From: Ray Andrews @ 2021-03-25 3:22 UTC (permalink / raw) To: zsh-users On 2021-03-24 7:37 p.m., Bart Schaefer wrote: > The FORCE_FLOAT shell option can be used > in scripts or functions where floating point evaluation is required > throughout. > Ha! ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2021-03-25 3:22 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-03-24 17:19 forcing float arithmetic Ray Andrews 2021-03-24 17:56 ` Bart Schaefer 2021-03-24 21:51 ` Ray Andrews 2021-03-24 21:54 ` Roman Perepelitsa 2021-03-24 21:59 ` Bart Schaefer 2021-03-25 1:12 ` Ray Andrews 2021-03-25 1:36 ` Daniel Shahaf 2021-03-25 1:45 ` Ray Andrews 2021-03-25 2:37 ` Bart Schaefer 2021-03-25 3:22 ` Ray Andrews
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).