Converting fractional coordinates into cartesian coordinates for crystallography
You have to use a matrix to convert. This is derived in most textbooks on crystallography, such as McKie &amp; McKie 'Essentials of Crystallography'.
The matrix is
$$ M=\begin{bmatrix} a &amp; 0 &amp; \\b\cos(\gamma)&amp; b\sin(\gamma) &amp; 0\\c\cos(\beta) &amp; cn_2 &amp; c\sqrt{\sin^2(\beta)-n_2^2} \end{bmatrix}$$
where $$n_2=\frac{\cos(\alpha)-\cos(\gamma)\cos(\beta)}{\sin(\gamma)}$$
and $a,b,c $ are the unit cell dimensions and $\alpha,\beta,\gamma$ the angles in radians. The determinant of $M$ is the cell volume.
If $V_1$ is the vector of fractional cell coordinates $x/a,y/b,z/c$ etc. the matrix multiplication calculation $\hat d_{12}=(V_1-V_2)\cdot M $ and then $L_{12}=\sqrt{ \hat d_{12}\cdot \hat d_{12}}$ gives the bond length atom 1 to 2. The angle $\theta$ between two bonds 12 and 23 is given by a dot product $\cos(\theta)=\hat d_{12}\cdot \hat d_{23}/(L_{12}L_{23})$
An example calculation in python is shown below for a triclinic crystal. The @ is matrix multiplication.
import numpy as np
a = 7.55                # cell parameters
b = 4.99
c = 12.50
alpha = 122.5*np.pi/180
beta  = (95+18/60)*np.pi/180
gama  = (118+54/60)*np.pi/180

V1 = np.array( [-0.2812 , -0.0628 , 0.1928 ] ) # x/a, y/a, z/a
V2 = np.array( [-0.2308 , -0.0972 , 0.2931 ] )
V3 = np.array( [-0.3639 , -0.1913 , 0.3521 ] )

n2 = (np.cos(alpha)-np.cos(gama)*np.cos(beta))/np.sin(gama)
M  = np.array([[a,0,0],[b*np.cos(gama),b*np.sin(gama),0], 
     [c*np.cos(beta),c*n2,c*np.sqrt(np.sin(beta)**2-n2**2)]])

dcm1 = (V1-V2) @ M             # row x matrix           
L12  =  np.sqrt(dcm1 @ dcm1)   # sqrt(dot product) 
L12