commit 49633440660e91d1b125a53e745e9d053777b61a
parent e9865d6e6227c828c750502e7473d4dae5759232
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 19 Mar 2026 11:35:56 +0100
Use double precision to evaluate the mesh
Use double-precision floating-point numbers to linearly interpolate the
mesh value along an edge of its polyline. This ensures that the value of
the meshed spectrum at that node is calculated with greater precision.
The aim is to minimise numerical issues when sampling lines by
importance. In this case, the value of the node must necessarily be
greater than or equal to the sum of the values of its child nodes.
Diffstat:
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/sln_tree.c b/src/sln_tree.c
@@ -669,7 +669,7 @@ sln_mesh_eval(const struct sln_mesh* mesh, const double wavenumber)
const struct sln_vertex* vtx1 = NULL;
const float nu = (float)wavenumber;
size_t n; /* #vertices */
- float u; /* Linear interpolation paraeter */
+ double u; /* Linear interpolation parameter */
ASSERT(mesh && mesh->nvertices);
n = mesh->nvertices;
@@ -688,7 +688,7 @@ sln_mesh_eval(const struct sln_mesh* mesh, const double wavenumber)
ASSERT(vtx0->wavenumber < nu && nu <= vtx1->wavenumber);
/* Compute the linear interpolation parameter */
- u = (nu - vtx0->wavenumber) / (vtx1->wavenumber - vtx0->wavenumber);
+ u = (wavenumber - vtx0->wavenumber) / (vtx1->wavenumber - vtx0->wavenumber);
u = CLAMP(u, 0, 1); /* Handle numerical imprecisions */
if(u == 0) return vtx0->ka;