mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 03:05:11 -07:00
vim-patch:8.0.0614
Problem: float2nr() is not exactly right.
Solution: Make float2nr() more accurate. Turn test64 into a new style test.
(Hirohito Higashi, closes vim/vim#1688)
863e80b445
This commit is contained in:
parent
9281653233
commit
6757c503bd
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <float.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
@ -8562,9 +8563,9 @@ static void f_float2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
float_T f;
|
||||
|
||||
if (tv_get_float_chk(argvars, &f)) {
|
||||
if (f < -VARNUMBER_MAX) {
|
||||
if (f <= -VARNUMBER_MAX + DBL_EPSILON) {
|
||||
rettv->vval.v_number = -VARNUMBER_MAX;
|
||||
} else if (f > VARNUMBER_MAX) {
|
||||
} else if (f >= VARNUMBER_MAX - DBL_EPSILON) {
|
||||
rettv->vval.v_number = VARNUMBER_MAX;
|
||||
} else {
|
||||
rettv->vval.v_number = (varnumber_T)f;
|
||||
|
@ -224,6 +224,20 @@ func Test_str2float()
|
||||
call assert_fails("call str2float(function('string'))", 'E729:')
|
||||
endfunc
|
||||
|
||||
func Test_float2nr()
|
||||
call assert_equal(1, float2nr(1.234))
|
||||
call assert_equal(123, float2nr(1.234e2))
|
||||
call assert_equal(12, float2nr(123.4e-1))
|
||||
let max_number = 1/0
|
||||
let min_number = -max_number
|
||||
call assert_equal(max_number/2+1, float2nr(pow(2, 62)))
|
||||
call assert_equal(max_number, float2nr(pow(2, 63)))
|
||||
call assert_equal(max_number, float2nr(pow(2, 64)))
|
||||
call assert_equal(min_number/2-1, float2nr(-pow(2, 62)))
|
||||
call assert_equal(min_number, float2nr(-pow(2, 63)))
|
||||
call assert_equal(min_number, float2nr(-pow(2, 64)))
|
||||
endfunc
|
||||
|
||||
func Test_floor()
|
||||
call assert_equal('2.0', string(floor(2.0)))
|
||||
call assert_equal('2.0', string(floor(2.11)))
|
||||
@ -283,3 +297,36 @@ func Test_isnan()
|
||||
call assert_equal(0, isnan([]))
|
||||
call assert_equal(0, isnan({}))
|
||||
endfunc
|
||||
|
||||
" This was converted from test65
|
||||
func Test_float_misc()
|
||||
call assert_equal('123.456000', printf('%f', 123.456))
|
||||
call assert_equal('1.234560e+02', printf('%e', 123.456))
|
||||
call assert_equal('123.456', printf('%g', 123.456))
|
||||
" +=
|
||||
let v = 1.234
|
||||
let v += 6.543
|
||||
call assert_equal('7.777', printf('%g', v))
|
||||
let v = 1.234
|
||||
let v += 5
|
||||
call assert_equal('6.234', printf('%g', v))
|
||||
let v = 5
|
||||
let v += 3.333
|
||||
call assert_equal('8.333', string(v))
|
||||
" ==
|
||||
let v = 1.234
|
||||
call assert_true(v == 1.234)
|
||||
call assert_false(v == 1.2341)
|
||||
" add-subtract
|
||||
call assert_equal('5.234', printf('%g', 4 + 1.234))
|
||||
call assert_equal('-6.766', printf('%g', 1.234 - 8))
|
||||
" mult-div
|
||||
call assert_equal('4.936', printf('%g', 4 * 1.234))
|
||||
call assert_equal('0.003241', printf('%g', 4.0 / 1234))
|
||||
" dict
|
||||
call assert_equal("{'x': 1.234, 'y': -2.0e20}", string({'x': 1.234, 'y': -2.0e20}))
|
||||
" list
|
||||
call assert_equal('[-123.4, 2.0e-20]', string([-123.4, 2.0e-20]))
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -1172,6 +1172,49 @@ func Test_script_emty_line_continuation()
|
||||
\
|
||||
endfunc
|
||||
|
||||
"-------------------------------------------------------------------------------
|
||||
" Test 97: bitwise functions {{{1
|
||||
"-------------------------------------------------------------------------------
|
||||
func Test_bitwise_functions()
|
||||
" and
|
||||
call assert_equal(127, and(127, 127))
|
||||
call assert_equal(16, and(127, 16))
|
||||
call assert_equal(0, and(127, 128))
|
||||
call assert_fails("call and(1.0, 1)", 'E805:')
|
||||
call assert_fails("call and([], 1)", 'E745:')
|
||||
call assert_fails("call and({}, 1)", 'E728:')
|
||||
call assert_fails("call and(1, 1.0)", 'E805:')
|
||||
call assert_fails("call and(1, [])", 'E745:')
|
||||
call assert_fails("call and(1, {})", 'E728:')
|
||||
" or
|
||||
call assert_equal(23, or(16, 7))
|
||||
call assert_equal(15, or(8, 7))
|
||||
call assert_equal(123, or(0, 123))
|
||||
call assert_fails("call or(1.0, 1)", 'E805:')
|
||||
call assert_fails("call or([], 1)", 'E745:')
|
||||
call assert_fails("call or({}, 1)", 'E728:')
|
||||
call assert_fails("call or(1, 1.0)", 'E805:')
|
||||
call assert_fails("call or(1, [])", 'E745:')
|
||||
call assert_fails("call or(1, {})", 'E728:')
|
||||
" xor
|
||||
call assert_equal(0, xor(127, 127))
|
||||
call assert_equal(111, xor(127, 16))
|
||||
call assert_equal(255, xor(127, 128))
|
||||
call assert_fails("call xor(1.0, 1)", 'E805:')
|
||||
call assert_fails("call xor([], 1)", 'E745:')
|
||||
call assert_fails("call xor({}, 1)", 'E728:')
|
||||
call assert_fails("call xor(1, 1.0)", 'E805:')
|
||||
call assert_fails("call xor(1, [])", 'E745:')
|
||||
call assert_fails("call xor(1, {})", 'E728:')
|
||||
" invert
|
||||
call assert_equal(65408, and(invert(127), 65535))
|
||||
call assert_equal(65519, and(invert(16), 65535))
|
||||
call assert_equal(65407, and(invert(128), 65535))
|
||||
call assert_fails("call invert(1.0)", 'E805:')
|
||||
call assert_fails("call invert([])", 'E745:')
|
||||
call assert_fails("call invert({})", 'E728:')
|
||||
endfunc
|
||||
|
||||
"-------------------------------------------------------------------------------
|
||||
" Modelines {{{1
|
||||
" vim: ts=8 sw=4 tw=80 fdm=marker
|
||||
|
Loading…
Reference in New Issue
Block a user