Lazarus
Home
Help
TinyPortal
Search
Login
Register
Lazarus
»
Forum
»
Programming
»
Packages and Libraries
»
FPSpreadsheet
»
Handling of (relatively) large numbers
Free Pascal
Website
Downloads
Wiki
Documentation
Bugtracker
Mailing List
Lazarus
Website
Downloads (Laz+FPC)
Packages (OPM)
FAQ
Wiki
Documentation (RTL/FCL/LCL)
Bugtracker
CCR Bugs
IRC channel
GIT
Mailing List
Other languages
Foundation
Website
Useful Wiki Links
Project Roadmap
Getting the Source
Screenshots
How to use the forum
About donations (wiki)
Bookstore
Computer Math and Games in Pascal
(preview)
Lazarus Handbook
Search
Advanced search
Recent
Colore celle StringGrid
by
JuanBell
[
Today
at 10:37:56 pm]
FpDebug likely bug
by
440bx
[
Today
at 10:12:59 pm]
Any upgrades to fpWeb pag...
by
verasan
[
Today
at 10:11:46 pm]
Web Applications with Pas...
by
Handoko
[
Today
at 08:56:29 pm]
AI, NLP and CAI: Text Gen...
by
indydev
[
Today
at 08:54:00 pm]
Offical launch of the 1 B...
by
Gustavo 'Gus' Carreno
[
Today
at 08:48:22 pm]
Multidimensional arrays a...
by
KodeZwerg
[
Today
at 08:34:38 pm]
Ho Ho Ho IntraWeb in Laza...
by
Thaddy
[
Today
at 08:31:29 pm]
[SOLVED] System.Now gives...
by
alpine
[
Today
at 08:29:19 pm]
open dialog - default dir...
by
Nicole
[
Today
at 08:02:40 pm]
Installing and using Vamp...
by
Odacir
[
Today
at 07:58:22 pm]
Demo Scene Picture sinwav...
by
circular
[
Today
at 07:27:02 pm]
Demo Scene Bitmap Font Sc...
by
KodeZwerg
[
Today
at 07:21:14 pm]
what's difference between...
by
ASerge
[
Today
at 07:09:52 pm]
splitting an image
by
KodeZwerg
[
Today
at 07:07:21 pm]
Debugger error
by
bobonwhidbey
[
Today
at 07:03:07 pm]
How to: create DLL file f...
by
paule32
[
Today
at 07:02:31 pm]
Your best UI design - con...
by
circular
[
Today
at 06:48:12 pm]
Converting a string/index...
by
1HuntnMan
[
Today
at 06:35:19 pm]
Drawing grid lines on a t...
by
KodeZwerg
[
Today
at 05:42:19 pm]
Compile/Convert Delphi pr...
by
Martin_fr
[
Today
at 05:29:03 pm]
Lazarus features in a non...
by
Lutz Mändle
[
Today
at 05:26:34 pm]
Lazarus for Windows on aa...
by
msintle
[
Today
at 05:03:57 pm]
Parameter passing odditie...
by
KodeZwerg
[
Today
at 03:41:49 pm]
Surf Units in Text Mode I...
by
mosquito
[
Today
at 01:58:21 pm]
« previous
next »
Print
Pages: [
1
]
Author
Topic: Handling of (relatively) large numbers (Read 861 times)
jollytall
Sr. Member
Posts: 320
Handling of (relatively) large numbers
«
on:
April 08, 2022, 06:20:08 pm »
Wp,
Please check the following code:
Code: Pascal
[Select]
[+]
[-]
program
project1
;
{$mode objfpc}{$H+}
uses
sysutils
,
fpsTypes
,
fpspreadsheet
,
fpsopendocument
;
var
WB
:
TsWorkbook
;
WS
:
TsWorksheet
;
begin
WB
:
=
TsWorkbook
.
Create
;
WB
.
Options
:
=
WB
.
Options
+
[
boCalcBeforeSaving
,
boAutoCalc
]
;
WS
:
=
WB
.
AddWorksheet
(
'test'
)
;
WS
.
WriteFormula
(
0
,
0
,
'=-A2+A3'
)
;
WS
.
WriteNumber
(
1
,
0
,
5000000000
)
;
WS
.
WriteNumber
(
2
,
0
,
10000000000
)
;
writeln
(
WS
.
ReadFormula
(
0
,
0
)
)
;
writeln
(
WS
.
ReadAsText
(
0
,
0
)
)
;
writeln
(
WS
.
ReadAsText
(
1
,
0
)
)
;
writeln
(
WS
.
ReadAsText
(
2
,
0
)
)
;
WB
.
Free
;
readln
;
end
.
I get:
Code:
[Select]
-A2+A3
9294967296
5000000000
10000000000
Reading as number makes no difference.
If I delete one 0 from both numbers it works.
If I change the formula from -A2+A3 to A3-A2 it works.
Any idea?
Logged
wp
Hero Member
Posts: 11923
Re: Handling of (relatively) large numbers
«
Reply #1 on:
April 08, 2022, 07:16:29 pm »
Integer overflow... I don't know what Excel precisely understands as "integer". But since Excel is fairly old, I think that they do not mean Int64; therefore I decided to stick to standard 32-bit signed integer.
The other bug was a missing negative sign in the unary negation node.
To fix the issue open unit fpsexprparser and replace the "rtCell" case in procedure "TsUMinusExprNode.GetNodeValue" by the following code:
Code: Pascal
[Select]
[+]
[-]
rtCell
:
begin
cell
:
=
ArgToCell
(
Result
)
;
if
cell
=
nil
then
Result
:
=
FloatResult
(
0.0
)
else
if
(
cell
^
.
ContentType
=
cctUTF8String
)
then
begin
if
TryStrToFloat
(
cell
^
.
UTF8StringValue
,
val
)
then
Result
:
=
FloatResult
(
-
val
)
else
Result
:
=
ErrorResult
(
errWrongType
)
;
end
else
if
(
cell
^
.
ContentType
=
cctNumber
)
or
(
cell
^
.
ContentType
=
cctDateTime
)
then
begin
if
(
frac
(
cell
^
.
NumberValue
)
=
0.0
)
and
(
cell
^
.
NumberValue
>
=
-
Integer
(
MaxInt
)
-
1
)
and
(
cell
^
.
NumberValue
<
=
MaxInt
)
then
Result
:
=
IntegerResult
(
-
trunc
(
cell
^
.
NumberValue
)
)
else
Result
:
=
FloatResult
(
-
cell
^
.
NumberValue
)
;
end
else
if
(
cell
^
.
ContentType
=
cctBool
)
then
Result
:
=
ErrorResult
(
errWrongType
)
;
end
;
The same overflow is possible also in the TsUPlusExprNode:
Code: Pascal
[Select]
[+]
[-]
rtCell
:
begin
cell
:
=
ArgToCell
(
Result
)
;
if
cell
=
nil
then
Result
:
=
FloatResult
(
0.0
)
else
if
(
cell
^
.
ContentType
=
cctUTF8String
)
then
begin
if
TryStrToFloat
(
cell
^
.
UTF8StringValue
,
val
)
then
Result
:
=
FloatResult
(
val
)
else
Result
:
=
ErrorResult
(
errWrongType
)
;
end
else
if
cell
^
.
ContentType
=
cctNumber
then
begin
if
(
frac
(
cell
^
.
NumberValue
)
=
0.0
)
and
(
cell
^
.
Numbervalue
>
=
-
Integer
(
MaxInt
)
-
1
)
and
(
cell
^
.
NumberValue
<
=
MaxInt
)
then
Result
:
=
IntegerResult
(
trunc
(
cell
^
.
NumberValue
)
)
else
Result
:
=
FloatResult
(
cell
^
.
NumberValue
)
;
end
;
end
;
«
Last Edit: April 08, 2022, 07:48:28 pm by wp
»
Logged
jollytall
Sr. Member
Posts: 320
Re: Handling of (relatively) large numbers
«
Reply #2 on:
April 08, 2022, 07:37:43 pm »
Thanks,
Maybe for integers it was also that, but my actual numbers were not integer anyway, so it was more the second bug.
The good news, that these changes solved the issue.
Logged
Print
Pages: [
1
]
« previous
next »
Lazarus
»
Forum
»
Programming
»
Packages and Libraries
»
FPSpreadsheet
»
Handling of (relatively) large numbers
TinyPortal
© 2005-2018