Number | 348
|
Category | errata
|
Synopsis | /140 "**" as an integer trucated operator
|
State | closed
|
Class | mistaken
|
Arrival-Date | May 19 2003
|
Originator | Kurt Baty <kurt@wsfdb.wsfdb.com>
|
Release | 2001b
|
Environment |
|
Description |
Description The 3rd paragraph of Section 4.1.5 attempts to define the result type of the power operator. The following BTF thread discusses several issues with this definition. http://boydtechinc.com/btf/archive/btf_2002/1776.html Submitting for consideration by the ETF. Fix Part I: REPLACE (3rd paragraph of 4.1.5): The result of the power operator shall be real if either operand is a real, integer or signed. If both operands are unsigned then the result shall be unsigned. The result of the power operator is unspecified if the first operand is zero and the second operand is non-positive, or if the first operand is negative and the second operand is not an integral value. WITH (new 3rd and 4th paragraphs of 4.1.5): If either operand of the power operator is real, then the result type shall be real. If neither operand of the power operator is real, then the result type shall be determined as outlined in 4.4.1 and 4.5.1, with the second operand treated as self-determined. The result value is 'bx if the first operand is zero and the second operand is negative. The result value is 1 if the first operand is zero. op1 ** op2 where op1, op2 are not real: op1 is negative<-1 -1 zero 1 positive>1 --------------------------------------------------------------------- op2 is positive int(op1 ** op2) op2 is odd -> -1 1 0 1 int(op1 ** op2) op2 is even -> 1 zero 1 1 1 1 1 negative 0 op2 is odd -> -1 'bx 1 0 op2 is even -> 1 'bx ------------------------------------------------------------------------ Part II: REPLACE (Title of Table 15 in 4.1.5): Examples of modulus operators WITH (new Title of Table 15 in 4.1.5): Examples of modulus and power operators ------------------------------------------------------------------------ Part III: REPLACE (The sentence immediately prior to Table 15): Table 15 gives examples of modulus operations. WITH Table 15 gives examples of some modulus and power operations. ------------------------------------------------------------------------ Part IV: REPLACE (heading of first column in Table 15): Modulus expression WITH (new heading of first column in Table 15): Expression ------------------------------------------------------------------------ Part V: Append the following power operator examples to Table 15: Expression Result Comments 3**2 9 3*3 2**3 8 2*2*2, same result as 1<<3 2**0 1 By definition, and same result as 1<<0 2**-3'sb1 0 -3'sb1 treated as unsigned 7, same as 1<<-3'sb1 2.0**-3'sb1 0.5 -3'sb1 coerced to -1.0, giving real reciprocal 0**-1 'bx Integer division by zero is 'bx 9**0.5 3.0 Real square root 9.0**(1/2) 1.0 Integer division truncates exponent to zero -3.0**2.0 9.0 Defined, because real 2.0 is still integral value 2**(-3'so4/3'so2) 0 Exponent is -3'so2, = 1/4, Integer division truncates 0 ----- Begin Included Message ----- From kurt Tue May 13 10:30:51 2003 Date: Tue, 13 May 2003 10:30:46 -0500 (CDT) From: Kurt Baty <kurt> To: etf@boyd.com Subject: Re: errata/140 "**" as an integer trucated operator Cc: kurt OK how about this: integer x ** y results table in the form of the integer number plane | x values -> | -4 -3 -2 -1 0 1 2 3 4 y values -v | ----------------+------------------------------------------------------------------------------- | 4 | 256 81 16 1 0 1 16 81 256 | 3 | -64 -27 -8 -1 0 1 8 27 64 | 2 | 16 9 4 1 0 1 4 9 16 | 1 | -4 -3 -2 -1 0 1 2 3 4 | 0 | 1 1 1 1 1 1 1 1 1 | | -1/4 -1/3 -1/2 Inf 1/2 1/3 1/4 -1 | = 0 = 0 = 0 -1 = x 1 = 0 = 0 = 0 | | 1/16 1/9 1/4 Inf 1/4 1/9 1/16 -2 | = 0 = 0 = 0 1 = x 1 = 0 = 0 = 0 | | -1/64 -1/27 -1/8 Inf 1/8 1/27 1/64 -3 | = 0 = 0 = 0 -1 = x 1 = 0 = 0 = 0 | | 1/256 1/81 1/16 Inf 1/16 1/81 1/256 -4 | = 0 = 0 = 0 1 = x 1 = 0 = 0 = 0 | or going up the x = 4 column ... 1/256 1/64 1/16 1/4 1 4 16 64 256 = 0 = 0 = 0 = 0 or: x ** y where x, y are integers: x is negative zero positive --------------------------------------------------- y is positive int(x ** y) 0 int(x ** y) zero 1 1 1 negative x = -1 and x x = 1 -> 1 y is odd -> -1 else 0 x = -1 and y is even -> 1 else 0 two things not to like: 1) 0 ** 0 = 1 ? but: Summary of Algebraic Rules for Powers Rule for Multiplication: x ** n × x ** m = x ** (m+n) Rule for Division: x ** n ÷ x ** m = x ** (n-m) Rule for Raising a Power to a Power: (x ** n) ** m = x ** (n * m) Negative Exponents: A negative exponent indicates that the power is in the denominator: x ** -n = 1 / x ** n Identity Rule: Any nonzero number raised to the power of zero is equal to 1, x ** 0 = 1 (x not zero). where 0 ** 0 is explicit called out as not = 1 however: The discussion of 0^0 is very old. Euler argues for 0^0 = 1 since a^0 = 1 for a not equal to 0 . The controversy raged throughout the nineteenth century, but was mainly conducted in the pages of the lesser journals: Grunert's Archiv and Schlomilch's Zeitshrift. Consensus has recently been built around setting the value of 0^0 = 1 . read http://mathforum.org/dr.math/faq/faq.0.to.0.power.html 2) 0 ** negative = x ? If we follow the way verilog does the "/" for integers then 1 / 0 = x feedback? kurt ----- Begin Included Message ----- >From kurt Tue May 13 08:26:19 2003 Date: Tue, 13 May 2003 08:26:18 -0500 (CDT) >From: Kurt Baty <kurt> To: etf@boyd.com Subject: Re: errata/140 and errata/192: real values vs integer values Cc: kurt, Shalom.Bresticker@motorola.com > From Shalom.Bresticker@motorola.com Tue May 13 08:09:55 2003 > I ran this in VCS. Results attached. some quick editing of the log files shows that the results are all in agreement for an integer "/" with trucation. should the integer results of "**" be as if the last step (in the negetive exponent cases) was an integer "/" with trucation? so that 2 ** -1 = 0 not 1? kurt wsfdb% diff vxl_results vcs_results 1c1 < VERILOG-XL 4.00.s003 log file created May 13, 2003 07:19:19 --- > Compiler version 6.2R10; Runtime version 6.2R10; May 13 16:13 2003 14c14 < 4 / 3 as int = 1 as real = 1 = 1.333333333333333 --- > 4 / 3 as int = 1 as real = 1 = 1.33333 16,17c16,17 < 2 / 3 as int = 0 as real = 1 = 0.6666666666666666 < 1 / 3 as int = 0 as real = 0 = 0.3333333333333333 --- > 2 / 3 as int = 0 as real = 1 = 0.666667 > 1 / 3 as int = 0 as real = 0 = 0.333333 19,20c19,20 < -1 / 3 as int = 0 as real = 0 = -0.3333333333333333 < -2 / 3 as int = 0 as real = -1 = -0.6666666666666666 --- > -1 / 3 as int = 0 as real = 0 = -0.333333 > -2 / 3 as int = 0 as real = -1 = -0.666667 22c22 < -4 / 3 as int = -1 as real = -1 = -1.333333333333333 --- > -4 / 3 as int = -1 as real = -1 = -1.33333 41,44c41,44 < 4 / 0 as int = x as real = 0 = Infinity < 3 / 0 as int = x as real = 0 = Infinity < 2 / 0 as int = x as real = 0 = Infinity < 1 / 0 as int = x as real = 0 = Infinity --- > 4 / 0 as int = x as real = 0 = Inf > 3 / 0 as int = x as real = 0 = Inf > 2 / 0 as int = x as real = 0 = Inf > 1 / 0 as int = x as real = 0 = Inf 46,49c46,49 < -1 / 0 as int = x as real = 0 = -Infinity < -2 / 0 as int = x as real = 0 = -Infinity < -3 / 0 as int = x as real = 0 = -Infinity < -4 / 0 as int = x as real = 0 = -Infinity --- > -1 / 0 as int = x as real = 0 = -Inf > -2 / 0 as int = x as real = 0 = -Inf > -3 / 0 as int = x as real = 0 = -Inf > -4 / 0 as int = x as real = 0 = -Inf 68c68 < 4 / -3 as int = -1 as real = -1 = -1.333333333333333 --- > 4 / -3 as int = -1 as real = -1 = -1.33333 70,71c70,71 < 2 / -3 as int = 0 as real = -1 = -0.6666666666666666 < 1 / -3 as int = 0 as real = 0 = -0.3333333333333333 --- > 2 / -3 as int = 0 as real = -1 = -0.666667 > 1 / -3 as int = 0 as real = 0 = -0.333333 73,74c73,74 < -1 / -3 as int = 0 as real = 0 = 0.3333333333333333 < -2 / -3 as int = 0 as real = 1 = 0.6666666666666666 --- > -1 / -3 as int = 0 as real = 0 = 0.333333 > -2 / -3 as int = 0 as real = 1 = 0.666667 76c76 < -4 / -3 as int = 1 as real = 1 = 1.333333333333333 --- > -4 / -3 as int = 1 as real = 1 = 1.33333 86c86 < End of VERILOG-XL 4.00.s003 May 13, 2003 07:19:21 --- > V C S S i m u l a t i o n R e p o r t wsfdb% ----- End Included Message ----- ----- Begin Included Message ----- >From kurt Tue May 13 07:36:27 2003 Date: Tue, 13 May 2003 07:36:26 -0500 (CDT) >From: Kurt Baty <kurt> To: etf@boyd.com Subject: errata/140 and errata/192: real values vs integer values Cc: kurt I am wondering if the integer "/" in verilog should be a guide, the correct result in the "**" case? what is the group thinking? re: > If you applied this methodology to integer division, what result would > you get for 1 / 2? > if the real typed, answer = 0.5 and verilog converts real to integer by rounding then, 1 if integer division is truncated by definition then integer = truncate(real typed, answer) then 0 also: > 1. Make it inconsistent with all other operators in the Verilog language. so I rewrote the little test program: wsfdb% more ieee_etf_140_test.v module ieee_etf_140_test; `include "fphdl64_real_functions.inc" parameter limit = 4; integer x,y,answer,int_answer; real x_real,answer_real; reg [63:0] x_bits,answer_bits; initial begin x_real = 0.5; x = x_real; $display("x = %0d = x_real =",x,x_real); $display; for(y=limit;y>=-limit;y=y-1) begin for(x=limit;x>=-limit;x=x-1) begin x_real = x; // x_bits = $realtobits(x_real); // answer_bits = pow(x_bits,y); // answer_real = $bitstoreal(answer_bits); answer_real = x_real / y; int_answer = x / y; answer = answer_real; // $display("%0d ** %0d = %0d = ",x,y,answer,answer_real); $display("%0d / %0d as int = %0d as real = %0d = ",x,y,int_answer,answer,answer_real); end end end endmodule wsfdb% results: wsfdb% verilog ieee_etf_140_test.v VERILOG-XL 4.00.s003 May 13, 2003 07:19:19 Copyright (c) 1995 Cadence Design Systems, Inc. All Rights Reserved. Unpublished -- rights reserved under the copyright laws of the United States. Copyright (c) 1995 UNIX Systems Laboratories, Inc. Reproduced with Permission. THIS SOFTWARE AND ON-LINE DOCUMENTATION CONTAIN CONFIDENTIAL INFORMATION AND TRADE SECRETS OF CADENCE DESIGN SYSTEMS, INC. USE, DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF CADENCE DESIGN SYSTEMS, INC. RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1) and (2) of Commercial Computer Software -- Restricted Rights at 48 CFR 52.227-19, as applicable. Cadence Design Systems, Inc. 555 River Oaks Parkway San Jose, California 95134 For technical assistance please contact the Cadence Response Center at 1-877-CDS-4911 or send email to support@cadence.com For more information on Cadence's Verilog-XL product line send email to talkv@cadence.com Compiling source file "ieee_etf_140_test.v" Compiling included source file "fphdl64_real_functions.inc" Compiling included source file "fphdl64_real_functions_base.inc" Continuing compilation of source file "fphdl64_real_functions.inc" Continuing compilation of source file "ieee_etf_140_test.v" Highest level modules: ieee_etf_140_test x = 1 = x_real =0.5 4 / 4 as int = 1 as real = 1 = 1 3 / 4 as int = 0 as real = 1 = 0.75 2 / 4 as int = 0 as real = 1 = 0.5 1 / 4 as int = 0 as real = 0 = 0.25 0 / 4 as int = 0 as real = 0 = 0 -1 / 4 as int = 0 as real = 0 = -0.25 -2 / 4 as int = 0 as real = -1 = -0.5 -3 / 4 as int = 0 as real = -1 = -0.75 -4 / 4 as int = -1 as real = -1 = -1 4 / 3 as int = 1 as real = 1 = 1.333333333333333 3 / 3 as int = 1 as real = 1 = 1 2 / 3 as int = 0 as real = 1 = 0.6666666666666666 1 / 3 as int = 0 as real = 0 = 0.3333333333333333 0 / 3 as int = 0 as real = 0 = 0 -1 / 3 as int = 0 as real = 0 = -0.3333333333333333 -2 / 3 as int = 0 as real = -1 = -0.6666666666666666 -3 / 3 as int = -1 as real = -1 = -1 -4 / 3 as int = -1 as real = -1 = -1.333333333333333 4 / 2 as int = 2 as real = 2 = 2 3 / 2 as int = 1 as real = 2 = 1.5 2 / 2 as int = 1 as real = 1 = 1 1 / 2 as int = 0 as real = 1 = 0.5 0 / 2 as int = 0 as real = 0 = 0 -1 / 2 as int = 0 as real = -1 = -0.5 -2 / 2 as int = -1 as real = -1 = -1 -3 / 2 as int = -1 as real = -2 = -1.5 -4 / 2 as int = -2 as real = -2 = -2 4 / 1 as int = 4 as real = 4 = 4 3 / 1 as int = 3 as real = 3 = 3 2 / 1 as int = 2 as real = 2 = 2 1 / 1 as int = 1 as real = 1 = 1 0 / 1 as int = 0 as real = 0 = 0 -1 / 1 as int = -1 as real = -1 = -1 -2 / 1 as int = -2 as real = -2 = -2 -3 / 1 as int = -3 as real = -3 = -3 -4 / 1 as int = -4 as real = -4 = -4 4 / 0 as int = x as real = 0 = Infinity 3 / 0 as int = x as real = 0 = Infinity 2 / 0 as int = x as real = 0 = Infinity 1 / 0 as int = x as real = 0 = Infinity 0 / 0 as int = x as real = 0 = NaN -1 / 0 as int = x as real = 0 = -Infinity -2 / 0 as int = x as real = 0 = -Infinity -3 / 0 as int = x as real = 0 = -Infinity -4 / 0 as int = x as real = 0 = -Infinity 4 / -1 as int = -4 as real = -4 = -4 3 / -1 as int = -3 as real = -3 = -3 2 / -1 as int = -2 as real = -2 = -2 1 / -1 as int = -1 as real = -1 = -1 0 / -1 as int = 0 as real = 0 = -0 -1 / -1 as int = 1 as real = 1 = 1 -2 / -1 as int = 2 as real = 2 = 2 -3 / -1 as int = 3 as real = 3 = 3 -4 / -1 as int = 4 as real = 4 = 4 4 / -2 as int = -2 as real = -2 = -2 3 / -2 as int = -1 as real = -2 = -1.5 2 / -2 as int = -1 as real = -1 = -1 1 / -2 as int = 0 as real = -1 = -0.5 0 / -2 as int = 0 as real = 0 = -0 -1 / -2 as int = 0 as real = 1 = 0.5 -2 / -2 as int = 1 as real = 1 = 1 -3 / -2 as int = 1 as real = 2 = 1.5 -4 / -2 as int = 2 as real = 2 = 2 4 / -3 as int = -1 as real = -1 = -1.333333333333333 3 / -3 as int = -1 as real = -1 = -1 2 / -3 as int = 0 as real = -1 = -0.6666666666666666 1 / -3 as int = 0 as real = 0 = -0.3333333333333333 0 / -3 as int = 0 as real = 0 = -0 -1 / -3 as int = 0 as real = 0 = 0.3333333333333333 -2 / -3 as int = 0 as real = 1 = 0.6666666666666666 -3 / -3 as int = 1 as real = 1 = 1 -4 / -3 as int = 1 as real = 1 = 1.333333333333333 4 / -4 as int = -1 as real = -1 = -1 3 / -4 as int = 0 as real = -1 = -0.75 2 / -4 as int = 0 as real = -1 = -0.5 1 / -4 as int = 0 as real = 0 = -0.25 0 / -4 as int = 0 as real = 0 = -0 -1 / -4 as int = 0 as real = 0 = 0.25 -2 / -4 as int = 0 as real = 1 = 0.5 -3 / -4 as int = 0 as real = 1 = 0.75 -4 / -4 as int = 1 as real = 1 = 1 0 simulation events (use +profile or +listcounts option to count) CPU time: 0.3 secs to compile + 0.2 secs to link + 0.1 secs in simulation End of VERILOG-XL 4.00.s003 May 13, 2003 07:19:21 wsfdb% > >From: Steven Sharp <sharp@cadence.com> > > The advantage of allowing real values for ranges is that it allows the > > power operator to always return a real, which simplifies implementation. > > I suppose that making the power operator always return a real might save > some time for a few simulator implementors. It is hardly a convincing > argument. We could make the same argument about eliminating integer > addition, subtraction, multiplication, division and comparison operations, > and just producing reals for those too. I don't think users would be > happy about that. > > Making the power operator produce reals from integer inputs would > 1. Make it inconsistent with all other operators in the Verilog language. > 2. Make it impossible to get a correct value for integral results larger > than 56 bits. > 3. Call for the use of expensive floating point operations instead of > cheaper integer operations. > 4. Make synthesis of any expression with a power operator problematic. > > Steven Sharp > sharp@cadence.com > > From drm@xilinx.com Mon May 5 14:04:03 2003 > Date: Mon, 05 May 2003 13:11:00 -0600 > From: Dennis Marsa <drm@xilinx.com> > X-Accept-Language: en > MIME-Version: 1.0 > To: Kurt Baty <kurt@wsfdb.wsfdb.com> > Cc: etf@boyd.com > Subject: Re: 1364 issue 140 and negative exponents > Content-Transfer-Encoding: 7bit > X-BigFish: v > > Kurt Baty wrote: > > > > Precedence: bulk > > > > > From drm@xilinx.com Mon May 5 13:41:55 2003 > > > > > > > 2 ** -1 = 1 = 0.5 > > > > -2 ** -1 = -1 = -0.5 > > > > > > > please note that: > > > > initial > > begin > > x_real = 0.5; > > x = x_real; > > $display("x = %0d = x_real =",x,x_real); > > $display; > > for(y=limit;y>=-limit;y=y-1) begin > > > > displays: > > > > Highest level modules: > > ieee_etf_140_test > > > > x = 1 = x_real =0.5 > > I am not sure what you are trying to convey with that > first $display statement before the main loop in your > test program. > > Are you trying to show that reals are being rounded > to nearest as opposed to being rounded towards zero? > > I had figured the results > > 2 ** -1 = 1 > -2 ** -1 = -1 > > were a result of rounding to nearest. > > But, my specific question is, are these the results you are > advocating for these particular operands? > > >From James' email today and from the discussion this morning, I had > thought the desired results would be: > > 2 ** -1 = 0 > -2 ** -1 = 0 > > Dennis > > > From kurt Mon May 5 14:55:03 2003 > Date: Mon, 5 May 2003 14:55:02 -0500 (CDT) > From: Kurt Baty <kurt> > To: drm@xilinx.com > Subject: Re: 1364 issue 140 and negative exponents > Cc: kurt > > > I am not sure what you are trying to convey with that > > first $display statement before the main loop in your > > test program. > > Yes, I to noticed the > > > 2 ** -1 = 1 > > -2 ** -1 = -1 > > rounding cases so the extra display statement shows that > verilog-XL does in fact round the real value 0.5 > to the integer value 1 > > > > > Are you trying to show that reals are being rounded > > to nearest as opposed to being rounded towards zero? > > > > I had figured the results > > > > 2 ** -1 = 1 > > -2 ** -1 = -1 > > > > were a result of rounding to nearest. > > > > Actually, this rounding is not "round nearest" > this is "round up" (I say "round away-from-zero" > so as to not be confused in negative numbers). > 0.5 would round to 0 in "round nearest". > > > But, my specific question is, are these the results you are > > advocating for these particular operands? > > yes, to took x ** y where x,y are integers and converted > x (integer -> real -> bits(ieee 64 floating point)) > > did a x_bits ** y using the pow function > > function [63:0] pow; // l**r, where l is fp64 and r is integer > > converted answer_bits (bits(ieee 64 floating point) -> real -> integer) > > and I make the claim that this is the most "math correct answer". > > > > > >From James' email today and from the discussion this morning, I had > > thought the desired results would be: > > > > 2 ** -1 = 0 > > -2 ** -1 = 0 > > > > I too was taken in!! (fished-in?!) > > kurt > > > > Kurt Baty wrote: > > > > > > Precedence: bulk > > > > > > > From drm@xilinx.com Mon May 5 13:41:55 2003 > > > > > > > > > 2 ** -1 = 1 = 0.5 > > > > > -2 ** -1 = -1 = -0.5 > > > > > > > > > > please note that: > > > > > > initial > > > begin > > > x_real = 0.5; > > > x = x_real; > > > $display("x = %0d = x_real =",x,x_real); > > > $display; > > > for(y=limit;y>=-limit;y=y-1) begin > > > > > > displays: > > > > > > Highest level modules: > > > ieee_etf_140_test > > > > > > From owner-etf@boyd.com Mon May 5 15:12:57 2003 > X-Authentication-Warning: max.boyd.com: majordomo set sender to owner-etf@boyd.com using -f > Date: Mon, 5 May 2003 15:12:02 -0500 (CDT) > From: Kurt Baty <kurt@wsfdb.wsfdb.com> > To: etf@boyd.com > Subject: Re: 1364 issue 140 and negative exponents > Cc: kurt@wsfdb.wsfdb.com > > Precedence: bulk > > x ** y where x, y are integers: > > x is positive zero negative > --------------------------------------------------- > y is > > positive x ** y 0 x ** y > > zero 1 0 1 > > negative x = 1 -> 1 0 x = -1 and > x = 2 and y is odd -> -1 > y = -1 -> 1 x = -1 and > else 0 y is even -> 1 > x = -2 and > y = -1 -> -1 > else 0 > > > maybe someone could run the same thing in C, > and maybe VCS also? > > > kurt > > > > From drm@xilinx.com Mon May 5 15:36:01 2003 > Date: Mon, 05 May 2003 14:43:07 -0600 > From: Dennis Marsa <drm@xilinx.com> > X-Accept-Language: en > MIME-Version: 1.0 > To: Kurt Baty <kurt@wsfdb.wsfdb.com> > Cc: etf@boyd.com > Subject: Re: 1364 issue 140 and negative exponents > Content-Transfer-Encoding: 7bit > X-BigFish: v > > Kurt Baty wrote: > > > > > I had figured the results > > > > > > 2 ** -1 = 1 > > > -2 ** -1 = -1 > > > > > > were a result of rounding to nearest. > > > > > > > Actually, this rounding is not "round nearest" > > this is "round up" (I say "round away-from-zero" > > so as to not be confused in negative numbers). > > 0.5 would round to 0 in "round nearest". > > Then I'm confused. If the rounding was "away from zero", > then wouldn't all of the combinations whose real result > is in the range (0.0,1.0) round to an integer result of 1, > and likewise results in the range (-1.0,0.0) would round to > a integer result of -1? Your test program results don't > indicate this. > > In case it isn't already obvious, I am not a floating point > expert. > > > > But, my specific question is, are these the results you are > > > advocating for these particular operands? > > > > yes, to took x ** y where x,y are integers and converted > > x (integer -> real -> bits(ieee 64 floating point)) > > > > did a x_bits ** y using the pow function > > > > function [63:0] pow; // l**r, where l is fp64 and r is integer > > > > converted answer_bits (bits(ieee 64 floating point) -> real -> integer) > > > > and I make the claim that this is the most "math correct answer". > > If you applied this methodology to integer division, what result would > you get for 1 / 2? > > Dennis > > > From kurt Mon May 5 16:01:57 2003 > Date: Mon, 5 May 2003 16:01:56 -0500 (CDT) > From: Kurt Baty <kurt> > To: etf@boyd.com > Subject: Re: 1364 issue 140 and negative exponents > Cc: kurt > > > > > > > > I had figured the results > > > > > > > > 2 ** -1 = 1 > > > > -2 ** -1 = -1 > > > > > > > > were a result of rounding to nearest. > > > > > > > > > > Actually, this rounding is not "round nearest" > > > this is "round up" (I say "round away-from-zero" > > > so as to not be confused in negative numbers). > > > 0.5 would round to 0 in "round nearest". > > > > Then I'm confused. If the rounding was "away from zero", > > then wouldn't all of the combinations whose real result > > is in the range (0.0,1.0) round to an integer result of 1, > > and likewise results in the range (-1.0,0.0) would round to > > a integer result of -1? Your test program results don't > > indicate this. > > some functions: > > truncate -> real result in the range (0.0 <= fract < 1.0) > goes to 0 > ceiling -> real result in the range (0.0 < fract <= 1.0) > goes to 1 > round -> real result in the range (0.0 < fract < 0.50) > goes to 0 > real result in the range (0.5 < fract <= 1.0) > goes to 1 > real result is exactly (fract = 0.5) > case(rounding mode) > up: goes to 1 (round "away from zero") > down: goes to 0 (round "towards zero") > nearest: if(low bit of abs(integer) part is: > zero: goes to 0 > one: goes to 1 > > does this help? > > > > > In case it isn't already obvious, I am not a floating point > > expert. > > I must be. > > > > > > > But, my specific question is, are these the results you are > > > > advocating for these particular operands? > > > > > > yes, to took x ** y where x,y are integers and converted > > > x (integer -> real -> bits(ieee 64 floating point)) > > > > > > did a x_bits ** y using the pow function > > > > > > function [63:0] pow; // l**r, where l is fp64 and r is integer > > > > > > converted answer_bits (bits(ieee 64 floating point) -> real -> integer) > > > > > > and I make the claim that this is the most "math correct answer". > > > > If you applied this methodology to integer division, what result would > > you get for 1 / 2? > > > > if the real typed, answer = 0.5 > and verilog converts real to integer by rounding then, 1 > > if integer division is truncated by definition then > integer = truncate(real typed, answer) then 0 > > > kurt > > > > From kurt Mon May 5 16:32:47 2003 > Date: Mon, 5 May 2003 16:32:46 -0500 (CDT) > From: Kurt Baty <kurt> > To: etf@boyd.com > Subject: Re: 1364 issue 140 and negative exponents > Cc: kurt > > > > > > > In case it isn't already obvious, I am not a floating point > > > expert. > > > > I must be. > > > In 1997 I was luck enough to hear Dr. Leo Mildenberg talk at Havard University > he was billed as the "world's greatest expert on ancient greek coins". > In the Q&A at the end of his talk, he was asked how he got to be > the "world's greatest expert", his answer was "All the real experts have died!" > Dr. Mildenberg passed away in 2001. > > He may have figured out where all experts come from! > > > kurt > > > ----- End Included Message ----- ----- End Included Message ----- |
Fix |
|
Audit-Trail |
|
Unformatted |
|
Hosted by Boyd Technology