Understanding Smoke Point in Cooking with Wolfram

March 3, 2026

Gay Wilson, Food Data Curator, Wolfram|Alpha Scientific Content, and Robert Nachbar, Senior Project Director, Wolfram Solutions

When making pancakes, the first one is always tricky. Is the oil in the pan hot enough? Or too hot? If you start too soon, that first pancake is pale and greasy instead of golden brown and toasty. Wait too long and the temperature may reach the oil’s smoke point, leaving you with a burnt pancake and smoky kitchen.

Smoke point refers to the temperature at which an overheated fat or oil begins to visibly smoke. Understanding how to properly use oils can protect your pancakes and any foods you sauté, sear or fry. Here we examine the chemistry behind smoke points, then explore smoke point values available in the Wolfram Data Repository.

Making a Triglyceride

The chemistry of smoke point starts with the molecular structure of cooking oil, most typically a triglyceride.

Glycerol

Glycerol is a sugar alcohol found in fats and oils. Also known as glycerin commercially, it is a colorless, viscous liquid at room temperature:

ResourceFunction["MoleculeView"][(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"])]

The glycerol molecule has three hydroxyl (OH) groups:

Row[{MoleculePlot[(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"]),Bond[{"O","H"}],ImageSize->300],MoleculePlot3D[(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"]),Bond[{"O","H"}],ImageSize->300]}]

Glycerol is a major component of cooking fats and oils because of its many esters. Esters are formed when a carboxylic acid (–COOH) reacts with an alcohol (–OH).

Fatty Acids

Fatty acids, such as oleic acid and palmitic acid, are long hydrocarbon chains with a carboxylic acid at one end:

carboxylicAcidPattern=MoleculePattern[{"C","O","O","H"},{Bond[{1,2},"Double"],Bond[{1,3},"Single"],Bond[{3,4},"Single"]}];
Row[{MoleculePlot[(Entity["oleic acid", Entity["Chemical","OleicAcid"], "Entity[\"Chemical\", \"OleicAcid\"]", "chemical"]),carboxylicAcidPattern,ImageSize->300],MoleculePlot3D[(Entity["oleic acid", Entity["Chemical","OleicAcid"], "Entity[\"Chemical\", \"OleicAcid\"]", "chemical"]),carboxylicAcidPattern,ImageSize->300]}]

With one carbon-carbon double bond, oleic acid is a monounsaturated fatty acid. Polyunsaturated fatty acids have multiple C==C double bonds:

Row[{MoleculePlot[(Entity["palmitic acid", Entity["Chemical","PalmiticAcid"], "Entity[\"Chemical\", \"PalmiticAcid\"]", "chemical"]),carboxylicAcidPattern,ImageSize->300],MoleculePlot3D[(Entity["palmitic acid", Entity["Chemical","PalmiticAcid"], "Entity[\"Chemical\", \"PalmiticAcid\"]", "chemical"]),carboxylicAcidPattern,ImageSize->300]}]

With no double bonds, palmitic acid is a saturated fatty acid.

A fatty acid can bond to a hydroxyl group on the glycerol molecule to form an ester. Because glycerol has three hydroxyl groups available, it can bond with three fatty acids to form a triglyceride. Glycerol is considered the “backbone” of the triglyceride.

Ester Formation

Esterification reactions can be computed using PatternReaction and ApplyReaction. The esterification reaction combines a carboxylic acid and an alcohol to produce an ester and a molecule of water. We’ll use the reaction SMARTS notation to illustrate:

esterification=PatternReaction["([C:1][C:2](=[O:3])[OH:4]).([CX4:5][OH:6])>>([C:1][C:2](=[O:3])[O:6][C:5]).([OH2:4])"]

We can test it with acetic acid (vinegar) and ethanol (vodka) to give ethyl acetate (nail polish remover) and water:

ApplyReaction[esterification,{Molecule[(Entity["acetic acid", Entity["Chemical","AceticAcid"], "Entity[\"Chemical\", \"AceticAcid\"]", "chemical"])],Molecule[(Entity["ethanol", Entity["Chemical","Ethanol"], "Entity[\"Chemical\", \"Ethanol\"]", "chemical"])]}]

The reaction needs to be carried out successively until all the hydroxyls are esterified to make a triglyceride, which can be simulated using the FixedPoint function:

FixedPoint[Catenate@Map[Replace[ApplyReaction[esterification,{Molecule[(Entity["oleic acid", Entity["Chemical","OleicAcid"], "Entity[\"Chemical\", \"OleicAcid\"]", "chemical"])],#}],{}->{#}]&,#]&,{Molecule[(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"])]}]

By forming ester bonds between glycerol and three oleic acid molecules, we have produced the triglyceride triolein, which is prevalent in monounsaturated fats like olive oil:

MoleculePlot[(Entity["triolein", Entity["Chemical","Triolein"], "Entity[\"Chemical\", \"Triolein\"]", "chemical"]),ImageSize->300]

When glycerol forms ester bonds with three palmitic acid molecules, it produces the triglyceride tripalmitin, found in saturated fats like palm oil and lard:

MoleculePlot[(Entity["tripalmitin", Entity["Chemical","Tripalmitin"], "Entity[\"Chemical\", \"Tripalmitin\"]", "chemical"]),ImageSize->300]

Compare the melting points of these two forms of triglyceride:

Dataset[EntityValue[{(Entity["triolein", Entity["Chemical","Triolein"], "Entity[\"Chemical\", \"Triolein\"]", "chemical"]),(Entity["tripalmitin", Entity["Chemical","Tripalmitin"], "Entity[\"Chemical\", \"Tripalmitin\"]", "chemical"])},{"Phase","MeltingPoint"},"EntityPropertyAssociation"]]

Acrolein Formation

The ester bonds in a triglyceride are heat sensitive. When overheated, some of these bonds break, freeing the glycerol molecule and fatty acids. The freed glycerol dehydrates to produce acrolein.

Known by several names, acrolein is a volatile aldehyde with a pungent, irritating odor:

ChemicalData[(Entity["acrolein", Entity["Chemical","Acrolein"], "Entity[\"Chemical\", \"Acrolein\"]", "chemical"]),"AlternateNames"]

aldehydePattern=MoleculePattern[{"C","O","H"},{Bond[{1,2},"Double"],Bond[{1,3},"Single"]}];
MoleculePlot[(Entity["acrolein", Entity["Chemical","Acrolein"], "Entity[\"Chemical\", \"Acrolein\"]", "chemical"]),aldehydePattern]

How is acrolein generated from glycerol? Heating an alcohol yields a dehydration reaction. The loss of a water molecule from an alcohol molecule during dehydration produces an alkene, a hydrocarbon containing a carbon-carbon double bond (C==C):

dehydration=PatternReaction["[H:1][CX4:2][CX4:3][O:4][H:5]>>([C:2]=[C:3]).([H:1][O:4][H:5])"]

Applying the dehydration reaction in all possible ways to glycerol gives these sets of products:

ApplyReaction[dehydration,Molecule[(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"])],All]

The products prop-1-en-2,3-diol and prop-1-en-1,3-diol have an enol moiety (C==C—OH), which will spontaneously rearrange to a more stable carbonyl form (C—C==O):

enolToCarbonyl=PatternReaction["[C:1]=[C:2][O:3][H:4]>>[H:4][C:1][C:2]=[O:3]"]

Apply the rearrangement to each of these products:

ApplyReaction[enolToCarbonyl,#]&/@{Molecule[],Molecule[]}

The second product in the result, 3-hydroxypropanal, can undergo another dehydration to produce acrolein:

ApplyReaction[dehydration,Molecule[]]

Putting it all together (nonstoichiometrically) yields:

FixedPoint[Union@@MapThread[Replace[#1,{}->{#2}]&,{Union@@@Outer[Union@@ApplyReaction[#2,#1,All]&,#,{dehydration,enolToCarbonyl}],#}]&,{Molecule[(Entity["glycerol", Entity["Chemical","Glycerol"], "Entity[\"Chemical\", \"Glycerol\"]", "chemical"])]}]

Smoke Point

What is the connection between acrolein and smoke point? Smoke point is the temperature at which an overheated fat or oil begins to visibly smoke. Acrolein is a key component of this acrid smoke, visible when a fat or oil reaches its smoke point, which can irritate our eyes, nose and throat.

Free Fatty Acids

Smoke point is determined mostly by the amount of free fatty acids (FFAs) the fat or oil contains. Plant-based oils generally have fewer FFAs than animal fats. Therefore, vegetable oils like canola and corn oil tend to be more stable and have a higher smoke point.

Smoke points are approximate and can vary within the same type of oil depending upon whether the oil is refined or unrefined. Unrefined oils, such as sesame oil or extra virgin olive oil, have a lower smoke point and can burn more quickly. Unrefined oils are best for dressings and low–medium heat cooking.

Refined oils have undergone processing to remove impurities and have fewer FFAs. They have a milder, more neutral taste and higher smoke points, generally 400° F or greater. Because they can tolerate high heat, refined oils are appropriate for searing and frying.

Smoke Point Data

The Wolfram Data Repository contains the smoke point values for 20 cooking fats and oils.

View the smoke point data as a Tabular object:

oilsData = ResourceData["Smoke Point"]

Get the fats and oils with the highest smoke points:

TakeLargestBy[oilsData,#Fahrenheit&,3]

Get the fats and oils with the lowest smoke points:

TakeSmallestBy[oilsData,#Fahrenheit&,3]

Visualization

Sort the data by a specified column, then plot the smoke point values for all fats and oils in the dataset:

sortedOilsData = SortBy[ResourceData["Smoke Point"], "Fahrenheit"];
ListPlot[sortedOilsData -> "Fahrenheit", ]

Analysis

Retrieve the smoke point values in Celsius from the Tabular data, then join these values with the saturated fatty acids content (palmitic acid and stearic acid) for the relevant fats and oils:

namesEntitiesAndCelsius = Normal[ResourceData["Smoke Point"][[All, {1, 2, 4}]]];
entitiesAndPalmiticAcid = DeleteMissing[
   AssociationThread[namesEntitiesAndCelsius[[All, 2]], EntityValue[namesEntitiesAndCelsius[[All, 2]], EntityProperty["Food", "RelativePalmiticAcidContent"]]]];
entitiesAndStearicAcid = DeleteMissing[
   AssociationThread[namesEntitiesAndCelsius[[All, 2]], EntityValue[namesEntitiesAndCelsius[[All, 2]], EntityProperty["Food", "RelativeStearicAcidContent"]]]];
filteredData = Select[namesEntitiesAndCelsius, KeyExistsQ[entitiesAndPalmiticAcid, #["Entity"]] &];
combinedData = filteredData /. assoc_Association :> Append[assoc, {"RelativePalmiticAcidContent" -> entitiesAndPalmiticAcid[assoc["Entity"]], "RelativeStearicAcidContent" -> entitiesAndStearicAcid[assoc["Entity"]]}];
formattedData = {{"Fat/Oil", "Entity", "Smoke point", "Palmitic acid",
      "Stearic acid"}}~
   Join~({#["Oil type"], #["Entity"], #["Celsius"], #[
        "RelativePalmiticAcidContent"], #[
        "RelativeStearicAcidContent"]} & /@ combinedData);
Grid[formattedData, Frame -> All]

Use QuantityMagnitude and BarChart to visualize and compare the smoke points and saturated fatty acids:

oilNames=formattedData[[2;;,1]];
smokePoints=QuantityMagnitude[formattedData[[2;;,3]]];
palmiticAcid=QuantityMagnitude[formattedData[[2;;,4]]];
stearicAcid=QuantityMagnitude[formattedData[[2;;,5]]];
smokePointChart=BarChart[smokePoints,];
satFatData={palmiticAcid,stearicAcid};
satFatLabels={"Palmitic acid","Stearic acid"};
satFatAcidsChart=BarChart[satFatData,];
GraphicsRow[{smokePointChart,satFatAcidsChart}]

Best Practices for Flavor and Safety

Watch for oil in a heated pan to begin shimmering, then start cooking before it reaches the smoke point.

Use a thermometer to keep oil below its smoke point for good flavor and safer cooking.

Never leave hot oil unattended, especially when using a deep fryer.

Make sure your kitchen is well ventilated when cooking with hot oil.