[3dprinter-general] Bug#1041808: cura-engine: Several unit test failures on i686

Gregor Riepl onitake at gmail.com
Sun Jul 23 20:04:59 BST 2023

Source: cura-engine
Version: 5.0.0-1
Severity: serious
Tags: ftbfs
Justification: fails to build from source (but built successfully in the past)
Usertags: i686
Forwarded: https://github.com/Ultimaker/CuraEngine/issues/1192
X-Debbugs-Cc: onitake at gmail.com

On i686, CuraEngine 5.x fails to build due to failing unit tests.

This is a longstanding issue, going back to 4.4, where it was fixed by adding a
larger tolerance to test values.
However, the issue was not investigated thoroughly and returns in 5.0 with more
failing unit tests.

The root cause of these failures are rounding errors on i686, where the x87 FPU
produces different results than floating point units in other processors. These
differences are tiny, and usually not more than a few ULPs.

CuraEngine uses integer math in most places, but resorts to double-precision
floating-point calculations in certain cases. Afterwards, the results are
truncated to 64-bit integers (C type long long), and subsequent calculation is
done on the integer values. Truncation (aka round-toward-zero) is often ok and
works fine on amd64 (SSE2 floating-point math) and other CPUs, but produces
different results on the x87 FPU. When truncating, these produce off-by-one
errors in many cases, and the these errors can accumulate and lead to huge
differences in the unit tests.

By strategically adding explicit rounding (round-to-nearest) in the right
places, these errors can be eliminated. While this will produce subtly
different results in some cases, it is arguably more correct than always

And at least on amd64, there is no performance difference between truncation
and rounding: The SSE2 CVTTSD2SI and CVTSD2SI instructions have the same

-- System Information:
Debian Release: trixie/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (300, 'unstable'), (1, 'experimental-debug'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 6.3.0-2-amd64 (SMP w/4 CPU threads; PREEMPT)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

-- no debconf information

More information about the 3dprinter-general mailing list