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
TChart: +32% Processor lo...
by
Thaddy
[
Today
at 05:09:52 pm]
CompareText improvement
by
Stefan Glienke
[
Today
at 05:07:58 pm]
An ASCII logo for Pascal ...
by
Fred vS
[
Today
at 03:34:59 pm]
Setup landmap - databse
by
WimVan
[
Today
at 03:31:15 pm]
Improvement of packages/f...
by
lagprogramming
[
Today
at 03:12:57 pm]
[SOLVED] SysTraIcon event...
by
SWM1
[
Today
at 02:40:47 pm]
pdfium.dll loadfromfile f...
by
domasz
[
Today
at 02:14:41 pm]
[SOLVED] Timer
by
Pe3s
[
Today
at 12:36:33 pm]
QT5 PageControl Tab sizes
by
zeljko
[
Today
at 12:07:55 pm]
[ SOLVED ] Json parse pro...
by
superc
[
Today
at 11:58:37 am]
« previous
next »
Print
Pages: [
1
]
Author
Topic: Handling of (relatively) large numbers (Read 498 times)
jollytall
Full Member
Posts: 231
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: 10632
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
Full Member
Posts: 231
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