From: Matt Wette <matt.wette@gmail.com>
To: guile-user@gnu.org
Subject: Re: Double-precision floating point arithmetics behaves differently in Guile and in C
Date: Sun, 26 Sep 2021 12:11:03 -0700 [thread overview]
Message-ID: <f18d4482-3d82-8d4e-2171-5c192c2e2f91@gmail.com> (raw)
In-Reply-To: <CAMFYt2Z6zE0cm-419+VxS2uk792OVxX++Cnc5wBN-+M+jLRrbQ@mail.gmail.com>
Your post is a little vague. Are you comparing singular values vectors
of A vs
eigenvalues, eigenvectors of A'*A ? Also, SVD is iterative and
different algorithms may yield
different results (and some of the SVD algorithms out there are not great).
Are you using the exact same algorithm but noticing that (op x y) in Guile
behaves differently than (x op y) in C?
On 9/26/21 1:45 AM, Panicz Maciej Godek wrote:
> Hi,
>
> I recently ran into a very weird problem. I am using code for computing
> Singular Value Decomposition that's been ported do Scheme by Gerald Sussman
> as a part of the scmutils package (more specifically, I use some bits of
> code extracted from guile-scmutils
> <https://www.cs.rochester.edu/%7Egildea/guile-scmutils/>)
>
> The code is too long to paste here, but I have uploaded a copy to my github
> <https://github.com/panicz/slayer/blob/master/guile-modules/extra/scmutils/numerics/linear/svd.scm>
> .
>
> I have found an ellipsoid-fitting algorithm that leans on this SVD code:
> when I run it on a randomly generated set of points lying on an ellipsoid,
> the ellipsoid parameters are reconstructed correctly.
>
> The trouble begins when I try to port that code to C. Initially, I have
> used a C code for computing SVD that I've found elsewhere (which was based
> on the same Fortran code from LINPACK), but I eventually wrote code to
> convert Scheme code to C to make sure that both algorithms are identical
> (and at this point I am quite confident that they are).
>
> The problem is, that the results of floating-point operations behave
> slightly differently in C than in Guile, and these small numerical
> differences accumulate, and eventually start making huge differences -- at
> least that's something that I've noticed. Moreover, I can quite confidently
> say that the results that I get in C are incorrect -- that the *eigenvalues*
> (which translate to the radii of the ellipsoid) are very different, the
> calculated center of the ellipsoid is slightly different, and that the
> *eigenvectors* (which can be interpreted as a rotation of the ellipsoid)
> are very similar.
>
> Either way, the ellipsoid isn't reconstructed correctly, because the points
> used for reconstruction do not lie near that ellipsoid (unlike in the case
> of the C code).
>
> I am really troubled with this behavior -- according to the documentation,
> and to the bits of source code that I managed to analyze, Guile uses
> exactly the same representation of floating point numbers as the one I use
> in C -- namely, the double type. (I only use single-precision floats to
> express the input points, but I ran some tests using small integers on
> inputs, to make sure, that they are exactly representable -- and the
> results were still very different)
>
> Is there a way to make sure that the floating point operations in C behave
> identically as those in Guile?
next prev parent reply other threads:[~2021-09-26 19:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-26 8:45 Double-precision floating point arithmetics behaves differently in Guile and in C Panicz Maciej Godek
2021-09-26 11:55 ` Panicz Maciej Godek
2021-09-26 13:16 ` Eli Zaretskii
2021-09-26 16:48 ` Panicz Maciej Godek
2021-09-26 12:57 ` tomas
2021-09-26 19:11 ` Matt Wette [this message]
2021-09-27 14:04 ` Panicz Maciej Godek
2021-10-16 9:19 ` Maxime Devos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f18d4482-3d82-8d4e-2171-5c192c2e2f91@gmail.com \
--to=matt.wette@gmail.com \
--cc=guile-user@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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 read-only IMAP folder(s) and NNTP newsgroup(s).